AcWing311 月之谜(数位dp)
这道题需要知道该数是不是数字之和的倍数
数字之和比较好统计,但是有个问题是,每一次进行运算的时候,因为数一直在变化,所以当前数mod数字之和成不成立与之后的没有关系
所以我们考虑枚举模数,因为数字之和本来也没有多大
这样我们只需要在最后判断一下答案就行
#include<iostream> #include<cstring> #include<string> using namespace std; int f[20][100][100][2]; string l,r; string s; int sum; int len; int dfs(int cur, int sum1, int r, int flag){ if(cur==len) return sum1==sum&&r==0; auto &x=f[cur][sum1][r][flag]; if(x!=-1) return x; int v=9; if(flag) v=s[cur]-'0'; int i; int ans=0; for(i=0;i<=v;i++){ ans+=dfs(cur+1,sum1+i,(10*r+i)%sum,flag&(i==v)); } return x=ans; } int solve(string t){ s = t; len = s.size(); memset(f,-1,sizeof(f)); return dfs(0,0,0,1); } int check(string s){ int i; int sum1=0; int r=0; for(i=0;i<s.size();i++){ int x=s[i]-'0'; sum1+=x; r=(r*10+x)%sum; } return sum1==sum&&(r==0); } int main(){ cin>>l>>r; int ans=0; int i; for(sum=1;sum<=90;sum++){ ans+=(solve(r)-solve(l)+check(l)); } cout<<ans<<endl; }
没有人不辛苦,只有人不喊疼