AT_tdpc_number 数 题解
前置知识
解法
本题的提交在 luogu 上挂了,建议去原站或 Vjudge 上提交。
基础数位 DP,记录当前位置、已填的数码之和,接着记忆化搜索即可。
需要注意的是 \(0 \bmod d=0\),如果写得不太好看(未处理前导零)的话需要减去其贡献。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
const ll p=1000000007;
ll a[10010],f[10010][110];
char k[10010];
ll dfs(ll pos,ll pre,ll lead,ll limit,ll d)
{
if(pos<=0)
{
return (pre==0);
}
if(f[pos][pre]!=-1&&lead==0&&limit==0)
{
return f[pos][pre];
}
ll ans=0,maxx=(limit==0)?9:a[pos],i;
for(i=0;i<=maxx;i++)
{
ans=(ans+dfs(pos-1,(pre+i)%d,(i==0)*lead,(i==maxx)*limit,d))%p;
}
return (lead==0&&limit==0)?f[pos][pre]=ans:ans;
}
ll ask(ll len,ll d)
{
memset(f,-1,sizeof(f));
return dfs(len,0,1,1,d);
}
int main()
{
ll d,len,i;
scanf("%lld%s",&d,k+1);
len=strlen(k+1);
reverse(k+1,k+1+len);
for(i=1;i<=len;i++)
{
a[i]=k[i]-'0';
}
printf("%lld\n",(ask(len,d)-1+p)%p);
return 0;
}
后记
多倍经验:AT_dp_s Digit Sum
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18280478,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。