玄关。。
查看原帖
玄关。。
563663
xu222ux楼主2024/3/5 18:57
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int m,d,len;
string l,r; 
int f[2003][2003];
int s[2003];
int dfs(int x,int num,bool flag){
    if(!x)return (num==0); 
    if(!flag&&f[x][num]!=-1)return f[x][num];
    int up=flag?s[x]:9,ans=0;
    if((len-x+1)%2==1){
        for(int i=0;i<=up;i++){
            if(i==d)continue;
            ans=(ans+dfs(x-1,(num*10+i)%m,flag&&i==up))%mod; 
        }
    }else{
		if(d<=up)ans=(ans+dfs(x-1,(num*10+d)%m,flag&&d==up))%mod;
	}
    if(!flag)f[x][num]=ans;
    return ans;
}
signed main(){
    cin>>m>>d>>l>>r;
    int lenl=l.size();
    for(int i=lenl-1;i>=0;i--){
		if(l[i]!='0'){
			l[i]--;
			break;
		}else l[i]='9';
	}
	if(l[0]=='0'&&lenl!=1){
		string shi="";
		for(int i=1;i<lenl;i++)shi+=l[i];
		//cout<<shi<<endl;
		l=shi;
	}
	//cout<<l;
    int ansr,ansl;
	len=r.size();
    for(int i=0;i<len;i++)s[len-i]=r[i]-'0';
	memset(f,-1,sizeof(f));
	ansr=dfs(len,0,true);
	//cout<<ansr<<endl;
	len=l.size();
	for(int i=0;i<len;i++)s[len-i]=l[i]-'0';
	memset(f,-1,sizeof(f));
	ansl=dfs(len,0,true);
	//cout<<ansl<<endl;
    cout<<(ansr-ansl+mod)%mod;
    return 0;
}

额,这玩意要是d==0有问题,比如有一种数教:0000000000000000000000000000000000000000000000000000000000000000000000000000000009. 这一大堆0个很烦,有没有大佬想想办法。

2024/3/5 18:57
加载中...