CodeBlocks C - A Short problem

在这里插入图片描述
在这里插入图片描述
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));
}

猜你喜欢

转载自blog.csdn.net/king9666/article/details/87630035