Wannafly挑战赛18-A

版权声明:随意转载 https://blog.csdn.net/nuiniu/article/details/80786823

题目描述 

有一个长度为n的序列a,已知a[1]=a[n]=1,且对于2 <= x <= n,a[x] / a[x-1]是以下三个数字之一 [ 1,-2,0.5 ],问有多少种不同的序列满足题意。
两个序列不同当且仅当它们有至少一个位置上的数字不同,序列a可以为任何实数。

输入描述:

一个整数 表示n (1<= n <= 1e3)

输出描述:

一个整数 表示答案模109+7

示例1

输入

复制
5

输出

复制
7

#include<stdio.h>
int mod=1e9+7;
int d[1003][1003];

int main() 
{
	int n,i,j;
	
	while(scanf("%d",&n)!=EOF)
	{
		n--;
		for(i=0;i<=n;i++)
		{
			d[i][0]=1;
			d[i][i]=1;
			for(j=1;j<i;j++)
			{
				d[i][j]=(d[i-1][j-1]+d[i-1][j])%mod;
			}
		}
		
		long long ans=0;
		for(i=0;i*2<=n;i+=2)
		{
			ans=(ans+d[n][i]*d[n-i][i])%mod;
		}
		
		printf("%lld\n",ans);
	}
	
	return 0;
}
解题思路来源:https://www.nowcoder.com/acm/contest/view-submission?submissionId=28287910
思路:分成两类:1)只做1的运算:一种;2)做两个0.5,两个( -2)的运算:看0.5和(-2)的个数,当两者的个数相同且为偶数时(假设n=9,则总共进行了8次运算,则符合该定义的结果为0.5(-2)的个数为2个或4个;为2个时,八个空选两个位置排0.5,剩下六个空排9-2:C(8,2)*C(6,2);为4个时,八个空排四个0.5,剩下四个空排(-2):C(8,4)*C(4,4)。)。
总共:1+C(8,2)*C(6,2)+C(8,4)*C(4,4)。
先用杨辉三角将组合数打表,然后通过0.5(-2)的偶数倍进行模拟组合数的运算。

猜你喜欢

转载自blog.csdn.net/nuiniu/article/details/80786823
今日推荐