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;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12697884.html