/*
hdu 6198
题目大意就是
给你一个数k
问你用k个斐波拉契数不能组成的最小的数是几
比如 当k==1时
不能组成斐波拉契数就是4
因为 0 1 1 2 3 5 8 13 21 34
然后我们多列几项找规律
k==2时 答案为12
k==3时 答案为33
我们找到规律
答案为 f(2*k+3)-1
然后我们就用矩阵求出对应的斐波拉契数即可
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#define PI acos(-1.0)
#define ll long long
#define mod 998244353
using namespace std;
struct matrix
{
ll m[3][3];
};
matrix matrixmul(matrix a,matrix b)
{
matrix c;
for(int i=1; i<=2; i++)
for(int j=1; j<=2; j++)
{
c.m[i][j]=0;
for(int k=1; k<=2; k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
c.m[i][j]%=mod;
}
return c;
}
matrix quickpow(matrix m,int n)
{
matrix b;
memset(b.m,0,sizeof(b.m));
for(int i = 1; i <= 2; i++)
b.m[i][i] = 1;
while(n>=1)
{
if(n&1)
b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b;
}
int main()
{
cout<<"\n";
int k;
cin>>k;
matrix m;
m.m[1][1]=1;m.m[1][2]=1;
m.m[2][1]=1;m.m[2][2]=0;
matrix res=quickpow(m,2*k+3);
cout<<res.m[1][2]-1<<endl;
return 0;
}
hdu 6198
题目大意就是
给你一个数k
问你用k个斐波拉契数不能组成的最小的数是几
比如 当k==1时
不能组成斐波拉契数就是4
因为 0 1 1 2 3 5 8 13 21 34
然后我们多列几项找规律
k==2时 答案为12
k==3时 答案为33
我们找到规律
答案为 f(2*k+3)-1
然后我们就用矩阵求出对应的斐波拉契数即可
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#define PI acos(-1.0)
#define ll long long
#define mod 998244353
using namespace std;
struct matrix
{
ll m[3][3];
};
matrix matrixmul(matrix a,matrix b)
{
matrix c;
for(int i=1; i<=2; i++)
for(int j=1; j<=2; j++)
{
c.m[i][j]=0;
for(int k=1; k<=2; k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
c.m[i][j]%=mod;
}
return c;
}
matrix quickpow(matrix m,int n)
{
matrix b;
memset(b.m,0,sizeof(b.m));
for(int i = 1; i <= 2; i++)
b.m[i][i] = 1;
while(n>=1)
{
if(n&1)
b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b;
}
int main()
{
cout<<"\n";
int k;
cin>>k;
matrix m;
m.m[1][1]=1;m.m[1][2]=1;
m.m[2][1]=1;m.m[2][2]=0;
matrix res=quickpow(m,2*k+3);
cout<<res.m[1][2]-1<<endl;
return 0;
}