我从long long 看警钟该到了unsigned long long
确实解决了subtask#1超时问题,可是仍然WA一堆,不开O2会T一堆
不知道是long long 哪里爆炸了,抱着渺茫的希望换了__int128就一下AC了
希望有大牛能够指出我的问题,感激不尽
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int N,M,base=10;
struct matrix{
int n,m;
int val[3][3];
matrix(int n,int m):n(n),m(m){memset(val,0,sizeof val);}
matrix operator * (const matrix B) const{
matrix ret(n,B.m);
for(int i=0;i<n;i++)for(int j=0;j<B.m;j++)for(int k=0;k<m;k++)ret.val[i][j]=((__int128)ret.val[i][j]+(__int128)val[i][k]*B.val[k][j])%M;\\此处添加__int128就过了
return ret;
}
matrix qpow(int x){
x--;
matrix temp=*this;
while(x){
if(x&1)*this=*this*temp;
temp=temp*temp;
x>>=1;
}
return *this;
}
};
signed main(){
matrix OP(3,3),op(3,3),ans(1,3);
OP.val[1][0]=OP.val[1][1]=OP.val[2][1]=OP.val[2][2]=1;
ans.val[0][1]=ans.val[0][2]=1;
scanf("%llu %llu",&N,&M);
while(N>0){
op=OP;
op.val[0][0]=base;
int step=base-(base/10);
if(N<step){
ans=ans*(op.qpow(N));
break;
}else{
ans=ans*(op.qpow(step));
N-=step;
}
base=base*10;
}
printf("%llu",ans.val[0][0]);
return 0;
}