Time limit1000 ms
Memory limit32768 kB
OS/Windows
三个循环结,矩阵快速幂,注意时间要求,此方法比较省时间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double s64;
ll n;
int m=2;
const int N=3;
const int pyzs[N]={1e9+7,222222224,183120};
int tmp[N][N],a[N][N],b[N][N];
inline void simplex(int a[N][N],int pyz)
{
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=m;++k)
tmp[i][j]=(tmp[i][j]+(ll)a[i][k]*b[k][j]%pyz)%pyz;
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
a[i][j]=tmp[i][j];
}
inline int ksm(ll t,int mod)
{
if(mod==-1) return t;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[1][1]=0;
a[1][2]=1;
b[1][2]=1;
b[2][1]=1;
b[2][2]=3;
while(t)
{
if(t&1) simplex(a,pyzs[mod]);
simplex(b,pyzs[mod]);
t>>=1;
}
return ksm(a[1][1],mod-1);
}
int main()
{
while(cin>>n)
printf("%d\n",ksm(n,2));
}