(UVA)11361 - Investigating Div-Sum Property
Posted SJY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(UVA)11361 - Investigating Div-Sum Property相关的知识,希望对你有一定的参考价值。
(UVA)11361 - Investigating Div-Sum Property
思路:记忆化搜索;
因为所有位置上的数字加起来和不会超过99的,所以k的有效值<100,所以当k>=100时,答案为0,
然后dp[i][j][k][s],表示在状i下,前j位上数表示的数对mod取模为k,前j位各个数的和对mod取模为s下的方案数。
i的状态一共只有两种,如果i为0则表示当前j-1位就为原数的前j-1为,那么当前位分两种情况,如果选原来的,那么i值不变就为0,如果选比原来小的,那么i在下一层变为1,那么剩下的所有位置上的数就可以选0--9的所有状态了,具体转移看代码。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<queue> 6 #include<string.h> 7 using namespace std; 8 typedef long long LL; 9 int dp[2][12][105][105]; 10 int ans[15]; 11 int N[10]; 12 int slove(int n,int k); 13 int dfs(int pos,int flag,int k,int sum,int mod); 14 int t = 0; 15 int main(void) 16 { 17 int T; 18 scanf("%d",&T); 19 int A,B,K; 20 N[0] = 1; 21 int i ; 22 N[1] = 10; 23 for(i = 2; i <= 9; i++) 24 { 25 N[i] = N[i-1]*10; 26 } 27 while(T--) 28 { 29 scanf("%d %d %d",&A,&B,&K); 30 memset(dp,0,sizeof(dp)); 31 if(K >= 100) 32 { 33 printf("0\n"); 34 } 35 else 36 { 37 printf("%d\n",slove(B,K)-slove(A-1,K)); 38 } 39 } 40 return 0; 41 } 42 int slove(int n,int k) 43 { 44 int cn = 0; 45 while(n) 46 { 47 ans[++cn] = n%10; 48 n /= 10; 49 } 50 t = 0; 51 memset(dp,-1,sizeof(dp)); 52 return dfs(cn,0,0,0,k); 53 } 54 int dfs(int pos,int flag,int k,int sum,int mod) 55 { 56 if(pos == 0) 57 { 58 if(sum== 0&&k==0) 59 { 60 return 1; 61 } 62 else return 0; 63 } 64 if(dp[flag][pos][k][sum]!=-1) 65 { 66 return dp[flag][pos][k][sum]; 67 } 68 int ak = 0; 69 if(flag) 70 { 71 int i,j; 72 for(i = 0; i <= 9; i++) 73 { 74 int ss = dfs(pos-1,flag,(((k-N[pos-1]*i)%mod+mod)%mod),((sum-i)%mod+mod)%mod,mod); 75 if(ss>0)ak+=ss; 76 } 77 } 78 else if(!flag) 79 { 80 int i; 81 for(i = 0; i < ans[pos]; i++) 82 { 83 int dd= dfs(pos-1,flag^1,(((k-N[pos-1]*i)%mod+mod)%mod),((sum-i)%mod+mod)%mod,mod); 84 if(dd>0)ak+=dd; 85 } 86 int ss = dfs(pos-1,flag,(((k-N[pos-1]*ans[pos])%mod+mod)%mod),((sum-ans[pos])%mod+mod)%mod,mod); 87 if(ss>0)ak+=ss; 88 } 89 return dp[flag][pos][k][sum] = ak; 90 }
以上是关于(UVA)11361 - Investigating Div-Sum Property的主要内容,如果未能解决你的问题,请参考以下文章
uva 11361 Investigating Div-Sum Property 数位dp
(UVA)11361 - Investigating Div-Sum Property
题解 UVA11361 Investigating Div-Sum Property