20pts求助
查看原帖
20pts求助
800499
suzhikz楼主2024/11/8 13:06
#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]=(ll)(mod-mod/i)*inv[mod%i]%mod; 
	read(n);read(p);
	tot=1%p;
	ll l=0,len=0;
	ll st=0;
	if(n<=p){
		for(int i=1;i<=n;i++){
			st=tot;
			summ[tot]++;
			tot=(tot*10+1)%p;
		}
	}else{
		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;
			}
		}
		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=0;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 13:06
加载中...