题意:从含0的斐波那契数列中可重复的任取K个数,求这K个数的和无法形成的最小整数。
写了几个之后大胆的猜测
i
的答案是
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
struct Matrix{
ll a[5][5];
void init(){
for (int i=0;i<5;i++){
for (int j=0;j<5;j++){
a[i][j]=0;
}
}
}
Matrix operator * (const Matrix &b) const{
Matrix tmp;
tmp.init();
for (int i=1;i<=2;i++){
for (int j=1;j<=2;j++){
for (int k=1;k<=2;k++){
tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*b.a[k][j]%mod+mod)%mod;
}
}
}
return tmp;
}
};
ll mat_pow(ll n,Matrix mat){
Matrix ans;
ans.init();
ans.a[1][1]=ans.a[2][2]=1;
n-=2;
while (n){
if (n&1)
ans=ans*mat;
n>>=1;
mat=mat*mat;
}
return (ans.a[1][1]+ans.a[1][2])%mod;
}
int main(){
ll i;
Matrix mat;
mat.init();
mat.a[1][1]=mat.a[1][2]=mat.a[2][1]=1;
while (scanf("%lld",&i)!=EOF){
// cout<<mat_pow(i,mat)<<endl;
ll ans=mat_pow((i+1)*2+1,mat);
printf("%lld\n",ans-1);
}
}