Description
问不能由kk个斐波那契数组成的最小正整数
Input
多组用例,每组用例输入一整数
Output
对于每组用例,输出答案,结果模998244353998244353
Sample Input
1
Sample Output
4
Solution
k=1k=1时,答案为4=f(5)−14=f(5)−1,k=2k=2时,答案为12=f(7)−112=f(7)−1,假设不能由ii个斐波那契数组成的最小正整数为,下面证明不能由i+1i+1个斐波那契数组成的最小正整数为f(2i+5)−1f(2i+5)−1
首先证明,i+1i+1个斐波那契数可以组成00~中的每个数字xx
1.,取第i+1i+1个斐波那契数为f(0)=0f(0)=0,前ii个数字可以组成~f(2i+3)−2f(2i+3)−2中每个数字
2.f(2i+3)−1≤x≤f(2i+4)−2f(2i+3)−1≤x≤f(2i+4)−2,取第i+1i+1个斐波那契数为f(2i+2)f(2i+2),由于前ii个数字可以组成~f(2i+3)−2f(2i+3)−2,故这i+1i+1个数字可以组成f(2i+2)f(2i+2)~f(2i+4)−2f(2i+4)−2,而i≥2i≥2时f(2i+2)<f(2i+3)−1f(2i+2)<f(2i+3)−1
3.x=f(2i+4)−1x=f(2i+4)−1,取第i+1i+1个斐波那契数为f(2i+3)f(2i+3),由f(2i+1)>1f(2i+1)>1知f(2i+2)−1<f(2i+3)−2f(2i+2)−1<f(2i+3)−2,故前ii个数可以表示出
4.f(2i+4)≤x≤f(2i+5)−2f(2i+4)≤x≤f(2i+5)−2,取第i+1i+1个斐波那契数为f(2i+4)f(2i+4)即可
然后证明,i+1i+1个斐波那契数不能组成f(2i+5)−1f(2i+5)−1,假设第i+1i+1个斐波那契数为f(x)f(x),显然0≤x≤2i+40≤x≤2i+4,而x−f(x)≥f(2i+5)−1−f(2i+4)=f(2i+3)−1x−f(x)≥f(2i+5)−1−f(2i+4)=f(2i+3)−1,前ii个数组不成,故i+1i+1个斐波那契数组不成f(2i+5)−1f(2i+5)−1
综上,kk个斐波那契数组不成的最小正整数为,用矩阵快速幂求解即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define mod 998244353
typedef ll Mat[2][2];
void Mul(Mat &A,Mat B)
{
Mat C;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
C[i][j]=0;
for(int k=0;k<2;k++)C[i][j]+=A[i][k]*B[k][j];
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
A[i][j]=C[i][j]%mod;
}
void Pow(Mat &A,int k)
{
Mat B={{1,0},{0,1}};
while(k)
{
if(k&1)Mul(B,A);
Mul(A,A);
k>>=1;
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
A[i][j]=B[i][j];
}
int main()
{
int k;
while(~scanf("%d",&k))
{
Mat A={{1,1},{1,0}};
Pow(A,2*k+2);
printf("%I64d\n",(A[0][0]+mod-1)%mod);
}
return 0;
}