#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
LL mod;
LL a[3]={183120,222222224,1000000007};
struct matrix{
LL f[2][2];
};
matrix mul(matrix a,matrix b)
{
LL i,j,k;
matrix c;
memset(c.f,0,sizeof(c.f));
for(k=0;k<2;k++)
{
for(i=0;i<2;i++)
{
if(!a.f[i][k])continue;
for(j=0;j<2;j++)
{
if(!b.f[k][j])continue;
c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j]%mod)%mod;
}
}
}
return c;
}
matrix pow_mod(matrix a,LL b)
{
matrix s;
memset(s.f,0,sizeof(s.f));
for(LL i=0;i<2;i++)
s.f[i][i]=1;
while(b)
{
if(b&1)
s=mul(s,a);
a=mul(a,a);
b=b>>1;
}
return s;
}
int main()
{
LL n;
while(cin>>n)
{
if(n==0)
{
cout<<0<<endl;
continue;
}
LL i,j,k;
matrix e,g;
e.f[0][0]=3;e.f[0][1]=1;
e.f[1][0]=1;e.f[1][1]=0;
for(i=0;i<3;i++)
{
mod=a[i];
g=pow_mod(e,n-1);
n=(g.f[0][0]==0?mod:g.f[0][0]);//注意n=0的情况
}
cout<<n%mod<<endl;
}
return 0;
}
/*
矩阵
|g[n-1] g[n-2]|*|3 1|=|g[n] g[n-1]|
|1 0|
gg(x)=g(g(x));
由于用g(x)求gg(x),g(x)不能对1e9+7取余,导致g(x)很大,所以不能直接求
输出结果可发现g(x),gg(x)都是循环的,暴力求出循环。
在%1e9+7的基础上g(g(g(x)))=g(g(g(x))+222222224),
在%222222224的基础上g(g(x))=g(g(x)+183120);
用mod={183120,222222224,1e9+7}循环三次矩阵乘法即可
*/
下面是招循环的代码:
#include <cstdio>
#include <iostream>
using namespace std;
#define LL __int64
//const int mod=1e9+7;
const LL mod=222222224;
int main()
{
LL i,a,b,g;
a=1,b=0;
for(i=1;;i++)
{
g=(3*a+b)%mod;
b=a;
a=g;
if(a==1&&b==0)
{
cout<<i<<endl;
break;
}
}
return 0;
}
//222222224,
//183120,