数字

给你一个斐波那契数列 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 }

这道题就打表+矩阵快速幂求斐波那契数列。。

原文地址:https://www.cnblogs.com/MyNameIsPc/p/7541673.html