RT,只能AC前六个测试点,T了最后一个点我可以理解,运算量太大了,但WA了剩下三个点不太理解为什么,有没有人帮忙看看啊
#include<bits/stdc++.h>
using namespace std;
int tmp[100];
struct bigN{
int num[100];
int len;
bigN(){
memset(num,0,sizeof(num));
len=0;
}
bigN(long long nn){
if(nn==0){
len=1;
memset(num,0,sizeof(num));
} else{
memset(num,0,sizeof(num));
len=0;
while(nn){
num[++len]=nn%10;
nn/=10;
}
}
}
bigN operator + (const bigN &N) const{
bigN ans;
ans.len = max(len, N.len);
for(int i=1;i<=ans.len;i++){
ans.num[i] += num[i] + N.num[i];
ans.num[i+1] += ans.num[i]/10;
ans.num[i] %= 10;
}
if(ans.num[ans.len+1]) ans.len++;
return ans;
}
bigN operator * (const bigN &N) const{
bigN ans;
ans.len=len+N.len-1;
for(int i=1;i<=len;i++){
for(int j=1;j<=N.len;j++){
ans.num[i+j-1] += num[i]*N.num[j];
ans.num[i+j] += ans.num[i+j-1]/10;
ans.num[i+j-1] %= 10;
}
}
if(ans.num[ans.len+1]) ans.len++;
return ans;
}
bigN operator % (const long long &N) const{
unsigned long long r=0;
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=len;i++){
tmp[i]=num[len-i+1];
}
for(int i=1;i<=len;i++){
r=r*10+(unsigned long long)(tmp[i]);
r%=N;
}
return bigN((long long)(r));
}
void print(){
for(int i=len;i>=1;i--) cout<<num[i];
cout<<endl;
}
};
long long m,a,c,X0,n,g;
struct Matrix{
bigN a[5][5];
Matrix operator * (const Matrix &M) const{
Matrix ans;
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
ans.a[i][j]=(ans.a[i][j]+((a[i][k]%m)*(M.a[k][j]%m))%m)%m;
}
}
}
return ans;
}
};
Matrix ksm(Matrix a, int b){
Matrix res;
for(int i=1;i<=2;i++) res.a[i][i]=bigN(1);
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
cin>>m>>a>>c>>X0>>n>>g;
Matrix O;
O.a[1][1]=bigN(a); O.a[1][2]=bigN(c);
O.a[2][1]=bigN(0); O.a[2][2]=bigN(1);
Matrix ANS = ksm(O,n);
bigN RES = (((ANS.a[1][1]*(bigN(X0)%m))%m+ANS.a[1][2])%m)%g;
RES.print();
return 0;
}