题目链接:XDOJ-1113-Too Light
设
dp[i][j]
为以
a[i]
结束的子串中,模
k
等于
状态转移方程为
dp[i][(j∗10+a[i])%k]+=dp[i][j]
。
初始化 dp[i][0]=1 。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
char s[maxn];
int a[maxn];
int dp[maxn][57];
int main()
{
int k,n;
a[0]=0;
while(~scanf("%s %d",s+1,&k))
{
n=strlen(s+1);
for(int i=1;i<=n;i++)
a[i]=s[i]-'0';
memset(dp,0,sizeof(dp));
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<k;j++)
dp[i][(j*10+a[i])%k]+=dp[i-1][j];
++dp[i][a[i]%k];
ans+=dp[i][0];
}
printf("%lld\n",ans);
}
return 0;
}