0分
#include<bits/stdc++.h>
using namespace std;
long long mod_mul(long long a,long long b,long long mod)
{
long long res=1,ans=a%mod;
while(b)
{
if(b&1)res=(res%mod+ans%mod)%mod;
ans=(ans%mod+ans%mod)%mod;
b>>=1;
}
return res%mod;
}
long long m;
struct mat
{
int n,m;
long long z[123][123];
mat(){n=m=0;memset(z,0,sizeof(z));}
mat(int _n,int _m){n=_n,m=_m;memset(z,0,sizeof(z));}
long long * operator [] (int b){return (this)->z[b];}
};
const mat error(-1,-1);
mat makeI(int n){mat c;c.m=c.n=n;for(int i=1;i<=n;i++)c.z[i][i]=1;return c;}
mat operator * (const mat &a,const mat &b)
{
if(a.m==-1||a.n==-1||b.m==-1||b.n==-1)return error;if(a.m!=b.n)return error;
mat c;c.n=a.n;c.m=b.m;
for(int i=1;i<=c.n;i++)
{
for(int j=1;j<=c.m;j++)
{
for(int k=1;k<=a.m;k++)
{
c.z[i][j]+=mod_mul(a.z[i][k]%m,b.z[k][j]%m,m);
c.z[i][j]%=m;
}
}
}
return c;
}
void operator *= (mat &a,const mat &b){a=a*b;}
mat ksm(mat a,long long b)
{
if(a.m==-1||a.n==-1)return error;if(a.m!=a.n)return error;
mat res=makeI(a.n),ans=a;
while(b){if(b&1)res*=ans;ans*=ans;b>>=1;}
return res;
}
long long a1,c,x,n,g;
int main()
{
cin>>m>>a1>>c>>x>>n>>g;
mat a(1,2);
a[1][1]=x;a[1][2]=c;
mat b(2,2);
b[1][1]=a1;b[1][2]=0;
b[2][1]=1;b[2][2]=1;
mat x=ksm(b,n);
x=a*x;
cout<<x[1][1]%g<<endl;
return 0;
}
10分
把快速幂改了一小下
#include<bits/stdc++.h>
using namespace std;
long long mod_mul(long long a,long long b,long long mod)
{
long long res=1,ans=a%mod;
while(b)
{
if(b&1)res=(res%mod+ans%mod)%mod;
ans=(ans%mod+ans%mod)%mod;
b>>=1;
}
return res%mod;
}
long long m;
struct mat
{
int n,m;
long long z[123][123];
mat(){n=m=0;memset(z,0,sizeof(z));}
mat(int _n,int _m){n=_n,m=_m;memset(z,0,sizeof(z));}
long long * operator [] (int b){return (this)->z[b];}
};
const mat error(-1,-1);
mat makeI(int n){mat c;c.m=c.n=n;for(int i=1;i<=n;i++)c.z[i][i]=1;return c;}
mat operator * (const mat &a,const mat &b)
{
if(a.m==-1||a.n==-1||b.m==-1||b.n==-1)return error;if(a.m!=b.n)return error;
mat c;c.n=a.n;c.m=b.m;
for(int i=1;i<=c.n;i++)
{
for(int j=1;j<=c.m;j++)
{
for(int k=1;k<=a.m;k++)
{
c.z[i][j]+=mod_mul(a.z[i][k]%m,b.z[k][j]%m,m);
c.z[i][j]%=m;
}
}
}
return c;
}
void operator *= (mat &a,const mat &b){a=a*b;}
mat ksm(mat xc,mat a,long long b)
{
if(a.m!=a.n)return error;
mat res=xc,ans=a;
while(b)
{
if(b&1)res=res*ans;
ans=ans*ans;
b>>=1;
}
return res;
}
long long a1,c,x,n,g;
int main()
{
cin>>m>>a1>>c>>x>>n>>g;
mat a(1,2);
a[1][1]=x;a[1][2]=c;
mat b(2,2);
b[1][1]=a1;b[1][2]=0;
b[2][1]=1;b[2][2]=1;
mat x=ksm(a,b,n);
cout<<x[1][1]%g<<endl;
return 0;
}
按道理说不会有差别啊。
还有咋得满分啊?