POJ 2748

题意:给n个圆柱作为底,往上面放圆柱,要求每一层上面的一定比这层的圆柱数少,另外,放的位置不同也要算新的一种,问总共有多少种。

题解:通过暴力打表可以看出,要求的g(n)就等于f(2*n-1),其中,f(i)是斐波拉契数列第i项,其次,这题坑爹的有100万组样例,log(n)直接求都会超时。所以,只能先找循环节,随便写个暴力程序求出循环节75000,然后就顺理成章了。

View Code
 1 #include<cstring>

 2 #include<cstdio>

 3 #include<set>

 4 #include<algorithm>

 5 using namespace std;

 6 const int mod=100000;

 7 int ans[mod];

 8 int main()

 9 {

10     int a,b,c,n,T;

11     a=1;b=1;

12     ans[1]=1;

13     for(int i=2;i<=75000;i++)

14     {

15         c=a+b;

16         c=(c>=mod)?(c%mod):c;

17         ans[i]=c;

18         a=c;

19         b+=c;

20         b=(b>=mod)?(b%mod):b;

21     }

22     for(scanf("%d",&T);T;T--)

23     {

24         scanf("%d",&n);

25         printf("%d\n",ans[(n-1)%75000+1]);

26     }

27     return 0;

28 }

你可能感兴趣的:(poj)