40分TLE求助
查看原帖
40分TLE求助
658786
STUDENT00楼主2022/11/26 14:54

求正解!

代码:

#include<bits/stdc++.h>
#define int long long
#define mod 999911659
using namespace std;
int n,p,A[500][15][15],B[500][15][15],ans;
int qpow(int a,int b){
	int s=1;
	while(b){
		if(b&1LL) s=s*a%p;
		a=a*a%p;
		b>>=1LL;
	}
	return s;
}
void dfs(int n){
	if(n==1LL){
		for(int i=0;i<=9;i++) B[i%p][i][i]++;
		return;
	}
	dfs(n>>1LL);
	swap(A,B);
	memset(B,0,sizeof(B));
	int base=qpow(10,n>>1LL);
	if(n&1LL){
		for(int i=0;i<=p;i++){
			for(int j=0;j<=p;j++){
				for(int a=0;a<=9;a++){
					for(int b=a;b<=9;b++){
						for(int c=b;c<=9;c++){
							for(int d=c;d<=9;d++){
								for(int e=d;e<=9;e++) (B[(i*base*10+j*10+e)%p][a][e]+=A[i][a][b]*A[j][c][d])%=mod;
							}
						}
					}
				}
			}
		}
	}else{
		for(int i=0;i<=p;i++){
			for(int j=0;j<=p;j++){
				for(int a=0;a<=9;a++){
					for(int b=a;b<=9;b++){
						for(int c=b;c<=9;c++){
							for(int d=c;d<=9;d++) (B[(i*base+j)%p][a][d]+=A[i][a][b]*A[j][c][d])%=mod;
						}
					}
				}
			}
		}
	}
}
signed main(){
	scanf("%lld%lld",&n,&p);
	dfs(n);
	for(int i=1;i<=9;i++){
		for(int j=i;j<=9;j++) ans+=B[0][i][j];
	}
	printf("%lld",ans%mod);
	return 0;
}
2022/11/26 14:54
加载中...