1588:数字游戏
时间限制: 1000 ms 内存限制: 524288 KB
题目描述
由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 modN 为 0。现在大家又要玩游戏了,指定一个整数闭区间 [a,b],问这个区间内有多少个取模数。
输入格式
题目有多组测试数据。每组只含三个数字 a,b,N。
输出格式
对于每个测试数据输出一行,表示各位数字和 modN 为 0 的数的个数。
样例
样例输入
1 19 9
样例输出
2
数据范围与提示
对于全部数据,1≤a,b≤2^31−1,1≤N<100。
sol:稍微变了变,但也很水难,而且要记录一个arr,因为很多dp值仍然是0,直接写if(dp[i]~~[i])就起不到记搜的效果了
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; int Mod; int Num[20],dp[20][10][105][2][2]; bool arr[20][10][105][2][2]; inline int dfs(int Weis,int Shuz,int Yus,bool Shangj,bool Qiand0) { if(arr[Weis][Shuz][Yus][Shangj][Qiand0]) return(dp[Weis][Shuz][Yus][Shangj][Qiand0]); arr[Weis][Shuz][Yus][Shangj][Qiand0]=1; if(Weis==1) return (dp[Weis][Shuz][Yus][Shangj][Qiand0]=(Shuz%Mod==Yus)?1:0); dp[Weis][Shuz][Yus][Shangj][Qiand0]=0; int i,Up=Shangj?Num[Weis-1]:9; for(i=0;i<=Up;i++) { bool Bo1=(Shangj&&i==Up),Bo2=(Qiand0&&i==0); dp[Weis][Shuz][Yus][Shangj][Qiand0]+=dfs(Weis-1,i,(Yus-Shuz%Mod+Mod)%Mod,Bo1,Bo2); } return dp[Weis][Shuz][Yus][Shangj][Qiand0]; } inline int Solve(int n) { if(n==0) return 1; *Num=0; while(n) { Num[++*Num]=n%10; n/=10; } int i,ans=0; ans+=dfs(*Num,0,0,0,1); for(i=1;i<Num[*Num];i++) { ans+=dfs(*Num,i,0,0,0); } ans+=dfs(*Num,Num[*Num],0,1,0); memset(arr,0,sizeof arr); return ans; } int main() { // freopen("test1.in","r",stdin); int l,r; while(~scanf("%d%d%d",&l,&r,&Mod)) { printf("%d\n",Solve(r)-Solve(l-1)); } return 0; } /* input 1 19 9 output 2 input 1 1893117615 79 output 62 */