版权声明:随意转载 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
#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)的偶数倍进行模拟组合数的运算。