样例#3过不去求助
查看原帖
样例#3过不去求助
394167
Cure_Wing楼主2022/10/4 13:51
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using std::cin;using std::cout;
constexpr long long mod=1000000007;
int m,d;
long long f[2001][2000];
std::string l,r;
inline long long dfs(int id,int sum,const std::string&s,bool tag,int len){
    if(id>len) return !sum;
    if(!tag&&~f[id][sum]) return f[id][sum];
    int top=tag?(s[id-1]^48):9;
    long long ans=0;
    if(id&1){
        for(int i=0;i<=top;++i)
            if(i!=d)
                ans=(ans+dfs(id+1,(sum*10+i)%m,s,tag&&(i==top),len))%mod;
    }else if(d<=top) ans=dfs(id+1,(sum*10+d)%m,s,tag&&(d==top),len)%mod;
    if(!tag) f[id][sum]=ans;
    return ans; 
}
inline long long divide(std::string s){
    return dfs(1,0,s,1,s.size());
}
inline bool check(std::string s){
    int len=s.size(),sum=0;
    for(int i=0;i<len;++i){
        if(i&1) if((s[i]^48)!=d) return 0;
        else if((s[i]^48)==d) return 0;
        sum=(sum*10+(s[i]^48))%m;
	}
    return !sum;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
    cin>>m>>d>>l>>r;
    int down=r.size();
    for(int i=1;i<=down;++i)
        for(int j=0;j<=9;++j)
            f[i][j]=-1;
    cout<<((divide(r)-divide(l)+check(l))%mod+mod)%mod;
    return 0;
}
2022/10/4 13:51
加载中...