/*找到循环节*/
#include <stdio.h>
int main()
{
long long a,b,c,i;
a=0;
b=1;
for(i=1;;i++)
{
c=(a+3*b)%222222224;
c=c%222222224;
a=b%222222224;
b=c%222222224;
if(a==0 && b==1)
{
printf("%d\n",i);
break;
}
}
// for(;;);
}
#include <stdio.h>
#define N 2
struct matrix
{
long long m[2][2];
}A,B;
void init()
{
A.m[0][0]=1, A.m[0][1]=0;
A.m[1][0]=0, A.m[1][1]=1;
B.m[0][0]=3, B.m[0][1]=1;
B.m[1][0]=1, B.m[1][1]=0;
}
matrix matrixmul(matrix a,matrix b,long long mod)
{
matrix c;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
c.m[i][j]=0;
for(int k=0;k<N;k++)
c.m[i][j] += (a.m[i][k]*b.m[k][j])%mod;
c.m[i][j]%=mod;
}
return c;
}
long long qiuckpow(long long n,long long mod)
{
matrix m=B,b=A;
if(n==0) return 0;
n--;
while(n>=1)
{
if(n&1)
b = matrixmul(b,m,mod);
n = (n>>1);
m = matrixmul(m,m,mod);
}
return b.m[0][0];
}
int main()
{
long long n;
long long ans;
init();
while(scanf("%I64d",&n)!=EOF)
{
ans = qiuckpow(n,183120);
ans = qiuckpow(ans,222222224);
ans = qiuckpow(ans,1000000007);
printf("%I64d\n",ans);
}
return 0;
}
hdu 4291(矩阵幂)
最新推荐文章于 2019-12-18 20:07:00 发布