题目;http://acm.hdu.edu.cn/showproblem.php?pid=5459
题意 给出一组字符串,每个字符串都是前两个字符串相加而成,求第n个字符串的c的各个坐标的差的和,结果要模530600414.
很容易看出字符串的长度及c的个数都是由斐波那契数列构成的,得到最后结果是ans[i]=ans[i-1]+ans[i-2]+x,要求的就是x
假设第n项中字符‘c‘的个数为cn,字符‘c‘坐标之和为sn,字符串长度为ln
当形成第i个字符串的时候对于第i-1个字符串来说,这个串里的每个’c‘所增加的值为i-2中’c‘的反向坐标(就是串长 - 坐标,记为cc ),即c2*(c1*l1-s1);(把c1*n1-s1 拆分成一个一个的c相加,就相当于c1个cc相加)
对于第i-2个字符串来说就是每个’c‘所增加的值就为i-1中’c‘的坐标,即c1*s2
两者之和就是x
这题当输入3或者4的时候都输出0或者都输出1的时候都可以,就是说后端数据中没有3和4折两组
1 #include<cstdio> 2 using namespace std; 3 typedef long long ll; 4 int mod=530600414; 5 ll ans[201315],c[201315],s[201315],l[201315]; 6 int main() 7 { 8 int t,n,i,sum; 9 ans[3]=0;ans[4]=0; 10 c[3]=1;s[3]=1;l[3]=3; 11 c[4]=1;s[4]=3;l[4]=5; 12 for (i=5;i<=201314;i++) 13 { 14 ans[i]=(((ans[i-1]+ans[i-2])%mod+c[i-2]*s[i-1])%mod+((c[i-2]*l[i-2]-s[i-2])%mod*c[i-1])%mod)%mod; 15 l[i]=(l[i-1]+l[i-2])%mod; 16 c[i]=(c[i-1]+c[i-2])%mod; 17 s[i]=((s[i-1]+s[i-2])%mod+l[i-2]*c[i-1])%mod; 18 } 19 ans[3]=1,ans[4]=1;//所以这一步要不要无所谓 20 while (~scanf("%d",&t)) 21 { 22 sum=1; 23 while (t--) 24 { 25 scanf("%d",&n); 26 printf("Case #%d: %I64d\n",sum++,ans[n]); 27 } 28 } 29 return 0; 30 }
时间: 2024-11-06 03:33:58