Loj10166 数字游戏2
题目描述
由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 modN 为 000。现在大家又要玩游戏了,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个取模数。
枚举每一位,记录每一次枚举%n的余数,当枚举完时,如果余数是0,就+1,否则+0.
#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #define in(a) a=read() #define REP(i,k,n) for(int i=k;i<=n;i++) using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } int a,b,n,digit[105],dp[105][300],ind; inline int dfs(int pos,int state,bool flag){ if(!pos) return state==0; if(!flag && dp[pos][state]!=-1) return dp[pos][state]; int up,ans=0; if(flag) up=digit[pos]; else up=9; REP(i,0,up) ans+=dfs(pos-1,(state+i)%n,flag && i==digit[pos]); if(!flag) dp[pos][state]=ans; return ans; } inline int solve(int x){ ind=0; while(x){ digit[++ind]=x%10; x/=10; } digit[ind+1]=-1; return dfs(ind,0,1); } int main(){ while(scanf("%d%d%d",&a,&b,&n)!=EOF){ memset(dp,-1,sizeof(dp)); printf("%d\n",solve(b)-solve(a-1)); } }