一开始没想出来。。一看题解
我艹直接枚举数位的和啊。。。。。怪不得给50s。
还是太蠢。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long l,r,bit[20],ret=0,dp[20][170][170],vis[20][170][170],tot=0; void get_bit(long long x) { ret=0; while (x) {bit[++ret]=x%10;x/=10;} } long long dfs(long long pos,long long ret1,long long ret2,bool flag,long long mod) { if (!pos) return ((ret1==mod) && (!ret2)); if ((!flag) && (vis[pos][ret1][ret2]==tot)) return dp[pos][ret1][ret2]; long long ans=0,up=flag?bit[pos]:9; for (long long i=0;i<=up;i++) ans+=dfs(pos-1,ret1+i,(ret2*10+i)%mod,flag&&(i==bit[pos]),mod); if (!flag) dp[pos][ret1][ret2]=ans,vis[pos][ret1][ret2]=tot; return ans; } long long work(long long x) { get_bit(x); long long ans=0; for (long long i=1;i<=ret*9;i++) { tot++; ans+=dfs(ret,0,0,1,i); } return ans; } int main() { scanf("%lld%lld",&l,&r); printf("%lld\n",work(r)-work(l-1)); return 0; }