题解:P13046 [GCJ 2021 Finals] Divisible Divisions
LastKismet · · 题解
Sol
存在显然 DP 状态
假如
然而我们发现
Code
inline void Main(){
cin>>s>>d;
n=s.size();s=' '+s;
rep(i,1,n)a[i]=s[i]-'0';
rep(i,1,n)a[i]+=a[i-1]*10%d,a[i]%=d;
repl(i,0,d)sum[i][0]=sum[i][1]=0;S=0;rep(i,1,n)f[i][0]=f[i][1]=0;
ll m=d,m2=1,m5=1;
while(!(m%2))m/=2,m2*=2;
while(!(m%5))m/=5,m5*=5;
pw[0]=1;rep(i,1,n)pw[i]=pw[i-1]*10%m;
rep(i,0,n)exgcd(pw[i],m,iv[i],iv[i+1]),iv[i]=(iv[i]%m+m)%m;
f[0][1]=1;
rep(i,1,n){
ll t=10%d;
per(j,i-1,max(i-20,0)){
if((a[i]-a[j]*t%d+d)%d==0)f[i][1]+=f[j][0]+f[j][1];
else f[i][0]+=f[j][1];
t*=10,t%=d;
}
if(a[i]%m2==0&&a[i]%m5==0)
f[i][1]+=sum[a[i]*iv[i]%m][0]+sum[a[i]*iv[i]%m][1],
f[i][0]+=S-sum[a[i]*iv[i]%m][1];
else f[i][0]+=S;
if(i-20>=0)S+=f[i-20][1],sum[a[i-20]*iv[i-20]%m][0]+=f[i-20][0],sum[a[i-20]*iv[i-20]%m][1]+=f[i-20][1];
}
put(f[n][0]+f[n][1]);
}