【hdu4389】【数位DP】X mod f(x)

来源:互联网 发布:云计算前景分析知道 编辑:程序博客网 时间:2024/05/21 22:55

跟上一题状态表示差不多,只是如果要直接在状态中表示数位和很麻烦,考虑数位和最多为81,所以我们可以枚举每个数位和,累加答案。

代码:

#include<cstdio>#include<cstring>using namespace std;const int maxn = 11;const int maxsum = 82; int dp[maxn][maxsum][maxsum][maxsum];int digit[maxn];int T,a,b;void init(){freopen("hdu4389.in","r",stdin);freopen("hdu4389.out","w",stdout);}int dfs(int pos,int tot,int mo,int pre,bool inf){if(pos == -1)return tot == mo && pre == 0;if(!inf && dp[pos][pre][mo][tot] != -1)return dp[pos][pre][mo][tot];int ans = 0;int end = inf ? digit[pos] : 9;for(int i = 0;i <= end;i++){int npre = (pre * 10 + i) % mo;ans += dfs(pos - 1,tot + i,mo,npre,inf && i == end);}if(!inf)dp[pos][pre][mo][tot] = ans;return ans;}int calc(int x){int pos = 0,ret = 0;while(x){digit[pos++] = x % 10;x /= 10;}for(int i = 1;i <= 81;i++){ret += dfs(pos - 1,0,i,0,1);}return ret;}void readdata(){memset(dp,-1,sizeof(dp));scanf("%d",&T);int ca = 0;while(T--){scanf("%d%d",&a,&b);printf("Case %d: %d\n",++ca,calc(b) - calc(a - 1));}}int main(){init();readdata();return 0;}


原创粉丝点击