X Mod f (x)
Time Limit: 4000/2000 MS (Java/others) memory limit: 32768/32768 K (Java/Others)
Problem description
Here is a function f (x ):
Int F (int x ){
If (x = 0) return 0;
Return f (x/10) + x % 10;
}
Now, you want to know, in a given interval [a, B] (1 <= A <= B <= 109), how many integer x that Mod f (x) equal to 0.
Input
The first line has an integer T (1 <= T <= 50), indicate the number of test cases.
Each test case has two integers A, B.
Output
For each test case, output only one line containing the case number and an integer indicated the number of X.
Sample Input
21 10
11 20
Sample output
Case 1: 10
Case 2: 3
------------------------ Split line ---------------------
Memory-based search:
The data range is 9 to the power of 10. The number and the maximum value are 9*9 = 81. The enumerated digits and
Maintenance: POS dimension, current digit and A, enumerated digit and B, current modulo Mo, with or without the upper limit of E
DP [POS] [a] [B] [Mo];
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<queue>#include<deque>#include<stack>#include<map>#include<set>#include<cmath>#include<cstdlib>#include<cctype>#define inf 0x3f3f3f3f#define maxn 10000typedef long long LL;using namespace std;int dp[11][82][82][82];int num[11],pos,n,m;int dfs(int pos,int a,int b,int mo,int e){ if(pos==-1) return a==b&&!mo; if(!e&&dp[pos][a][b][mo]!=-1) return dp[pos][a][b][mo]; int end=e?num[pos]:9; int sum=0; for(int i=0;i<=end;i++){ sum+=dfs(pos-1,a+i,b,(mo*10+i)%b,e&&i==end); } return e?sum:dp[pos][a][b][mo]=sum;}void Init(int x){ pos=0; while(x){ num[pos++]=x%10; x/=10; }}int cal(int x){ Init(x); int res=0; for(int i=1;i<=81;i++){ res+=dfs(pos-1,0,i,0,1); } return res;}int main(){ int t,iCase=1; memset(dp,-1,sizeof dp); cin>>t; while(t--){ scanf("%d%d",&m,&n); printf("Case %d: %d\n",iCase++,cal(n)-cal(m-1)); }return 0;}
HDU 4389--x Mod f (x) (Digital DP)