为啥只有十分啊
查看原帖
为啥只有十分啊
800499
suzhikz楼主2024/11/8 12:20
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const ll N=505,mod=999911659;
ll n,p;
ll s[N],tot;
ll summ[N];
ll c[N][N];
ll dp[N][N][11];
ll inv[12];
int main(){
	inv[0]=1;
	inv[1]=1;
	for(int i=2;i<=9;i++)inv[i]=1ll*mod-1ll*(mod/i)*inv[mod%i]%mod;
	read(n);read(p);
	tot=1%p;
	ll l=0,len=0;
	for(ll i=1;i<=n;i++){
//		cout<<tot<<endl;
		if(s[tot]){
			l=s[tot];len=i-l;
			break;
		} else{
			summ[tot]++;
			s[tot]=i;
			tot=(tot*10+i)%p;
		}
	}
//	cout<<len;
	ll st=0;
	if(len==0){
		l=998244353;
		for(ll i=1;i<=n;i++)st=(st*10+1)%p;
	}
	for(ll i=0;i<p;i++){
		if(s[i]!=0){
			if(s[i]>=l){
				summ[i]=1;
				summ[i]=summ[i]+(n-s[i])/len%mod;
				if((n-l+1)%len==(s[i]-l+1)%len)st=i;
			}
		}
	}
	c[0][0]=1;
	for(ll i=1;i<=p;i++){
		c[i][0]=1;
		if(!summ[i])continue;
		for(ll j=1;j<=9;j++,summ[i]=(summ[i]+1)%mod){
			c[i][j]=c[i][j-1]*summ[i]%mod*inv[j]%mod;
		}
	}
	dp[0][st][0]=1;
//	cout<<st<<endl;
	for(ll i=0;i<p;i++){
		for(ll j=0;j<p;j++){
			for(ll k=0;k<9;k++){
				for(ll o=0;o<9-k;o++){
					dp[i+1][(j+o*i)%p][o+k]+=dp[i][j][k]*c[i][o]%mod;
					dp[i+1][(j+o*i)%p][o+k]%=mod;
				}
			}
		}
	}
	ll ans=0;
	for(ll i=0;i<9;i++){
		ans+=dp[p][0][i];
		ans%=mod;
	}
	cout<<ans;
	return 0;
}

2024/11/8 12:20
加载中...