给你一个斐波那契数列 F:
F0=0,F1=1;
Fn=Fn−1+Fn−2;
给你一个数 k,可以从斐波那契数列中选取可以重复的 k 个数:Fa1,Fa2,
Fa3....
求最小的 N 使得,Fa1+Fa2+Fa3...+Fak 不能构成数字 N。k小于1e9
1 #include <cstdio> 2 using namespace std; 3 typedef long long LL; 4 5 const LL prime=998244353; 6 LL n, t; 7 LL a[2][2], tmp1[2][2], tmp2[2][2]; 8 9 void plus22(LL a[2][2], LL b[2][2]){ 10 tmp2[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; 11 tmp2[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]; 12 tmp2[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0]; 13 tmp2[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1]; 14 a[0][0]=tmp2[0][0]%prime, a[0][1]=tmp2[0][1]%prime; 15 a[1][0]=tmp2[1][0]%prime, a[1][1]=tmp2[1][1]%prime; 16 } 17 18 void plus21(LL a[2][2], LL b[2][2]){ 19 tmp2[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; 20 tmp2[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0]; 21 a[0][0]=tmp2[0][0]%prime, a[1][0]=tmp2[1][0]%prime; 22 } 23 24 LL fib(LL n){ 25 a[0][1]=0, a[1][0]=0, a[0][0]=1, a[1][1]=1; 26 tmp1[0][0]=tmp1[0][1]=tmp1[1][0]=tmp1[1][1]=1; 27 tmp1[1][1]=0; 28 --n; 29 while (n){ 30 if (n&1) plus22(a, tmp1); 31 plus22(tmp1, tmp1); 32 n>>=1; 33 } 34 tmp1[0][0]=1, tmp1[1][0]=0; 35 plus21(a, tmp1); 36 return a[0][0]; 37 } 38 39 int main(){ 40 while(~scanf("%lld", &n)) 41 printf("%lld ", (fib(2*n+3)-1)%prime); 42 return 0; 43 }
这道题就打表+矩阵快速幂求斐波那契数列。。