如果直接利用n做三次矩阵快速幂对1000000007取模求解的话会超精度,所以必须本地处理寻找每层的循环节,最外层对1000000007取模,则找到最外层的循环节是222222224,次外层对222222224取模,找到次外层循环节是183120。接下来利用这三个不同的mod进行三层快速幂。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
using namespace std;
const long long mod=1000000007;//每次改就好
int main()
{
long long t0=0, t1=1;
for(long long i=1; ; i++)
{
t0=(3*t1+t0)%mod;
swap(t0,t1);
if(t0==0&&t1==1)
{
cout << i <<endl;
break;
}
}
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define MOD 1000000007 //222222224 183120
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
using namespace std;
struct Mat { ll mat[2][2];};
Mat MatrixMult (Mat a, Mat b,int mod)
{
Mat c;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
{
c.mat[i][j]=0;
for(int k=0; k<2; k++)
{ c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%mod;
c.mat[i][j]%=mod;
}
}
return c;
}
Mat Matrix (Mat a, ll n,ll mod)
{
if(n==1)return a;
Mat ret=a;
Mat temp=a;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
if(i==j)ret.mat[i][j]=1;
else ret.mat[i][j]=0;
}
while(n)
{
if(n&1)ret=MatrixMult(ret,temp,mod);
temp=MatrixMult(temp,temp,mod);
n>>=1;
}
return ret;
}
int main()
{ ll n;
Mat A,B;
A.mat[0][0]=3;
A.mat[0][1]=1;
A.mat[1][0]=1;
A.mat[1][1]=0;
while(~scanf("%I64d",&n))
{ B=Matrix(A,n,183120);
B=Matrix(A,B.mat[1][0],222222224);
B=Matrix(A,B.mat[1][0],MOD);
printf("%I64d\n",B.mat[1][0]);
}
return 0;
}