题目;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 }

 

posted on 2015-09-22 15:58  蜘蛛侦探  阅读(148)  评论(0编辑  收藏  举报