BZOJ 1799 同类分布

Posted on 2016-12-31 22:44  ziliuziliu  阅读(179)  评论(0编辑  收藏  举报

一开始没想出来。。一看题解

我艹直接枚举数位的和啊。。。。。怪不得给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;    
}