unsigned long long不够?
查看原帖
unsigned long long不够?
936078
SinCircle楼主2023/10/12 14:22

我从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;
} 
2023/10/12 14:22
加载中...