[HDU6198]number number number
题目大意:
给定一个数k表示你可以从包括0的斐波那契数列中任取k个数,得到它们的和。求最小的不能得到的自然数。
思路:
打表找规律,可以发现答案为f(2k+3)-1,然后用公式f(i)=f(i/2)*f((i+1)/2-1)+f(i/2+1)*f(x+1)/2)。当然也可以用矩阵快速幂。
1 #include<cstdio> 2 #include<cctype> 3 #include<ext/hash_map> 4 inline int getint() { 5 char ch; 6 while(!isdigit(ch=getchar())); 7 int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 const int mod=998244353; 12 __gnu_cxx::hash_map<int,int> f; 13 int fib(const int x) { 14 if(!x) return 0; 15 if(x==1||x==2) return 1; 16 if(int t=f[x]) { 17 return t; 18 } else { 19 return f[x]=((long long)fib(x/2)*fib((x+1)/2-1)%mod+(long long)fib(x/2+1)*fib((x+1)/2)%mod)%mod; 20 } 21 } 22 int main() { 23 for(int T=getint();T;T--) { 24 printf("%d\n",(fib(3+getint()*2)+mod-1)%mod); 25 } 26 return 0; 27 }