题目描述
由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N\bmod NmodN 为 000。现在大家又要玩游戏了,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个取模数。
输入格式
题目有多组测试数据。每组只含三个数字 a,b,Na, b, Na,b,N。
输出格式
对于每个测试数据输出一行,表示各位数字和 mod N\bmod NmodN 为 000 的数的个数。
样例
样例输入
1 19 9
样例输出
2
数据范围与提示
对于全部数据,
解析:
还是裸得不能再裸的数位DP。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=12;
int n,m,l,r,f[Max][110][2];
char ch[Max];
inline int dfs(int pos,int sum,int limit)
{
if(pos==n+1) return !sum ? 1 : 0;
if(~f[pos][sum][limit]) return f[pos][sum][limit];
int mx=limit?ch[pos]-'0':9,ans=0;
for(int i=0;i<=mx;i++) ans+=dfs(pos+1,(sum+i)%m,limit&(i==mx));
return f[pos][sum][limit]=ans;
}
inline int solve(int num)
{
memset(f,-1,sizeof(f));
sprintf(ch+1,"%d",num),n=strlen(ch+1);
return dfs(1,0,1);
}
int main()
{
while(cin>>l>>r>>m) cout<<solve(r)-solve(l-1)<<"\n";
return 0;
}