求助,数位 DP 93 分
查看原帖
求助,数位 DP 93 分
363036
chlchl楼主2022/9/14 14:01

rt,第 99 个点 WA 了,少了几十万答案。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 12 + 5;
ll x, l, r, dgt[N], f[N][2][100010];
char s[20];
bool ok[N];

ll dp(int len, int op, int is0, ll mod){
	if(len <= 0)	return (mod ? 0 : 1);
	if(!is0 && f[len][op][mod] != -1)	return f[len][op][mod];
	ll cnt = 0; int k = (op ? dgt[len] : 9);
	for(int d=0;d<=k;d++){
		if(!ok[d])	continue;
		cnt += dp(len - 1, op & (d == k), is0 & (d == 0), (mod * 10LL + d) % x);
	}
	if(!is0)	 f[len][op][mod] = cnt;
	return cnt;
}

ll solve(ll now){
	int len = 0;
	do	dgt[++len] = now % 10;
	while(now /= 10);
	memset(f, -1, sizeof(f));
	return dp(len, 1, 1, 0LL);
}

int main(){
	scanf("%lld%lld%lld", &x, &l, &r);
	scanf("%s", s + 1);
	for(int i=1;i<=strlen(s+1);i++)	ok[s[i] - '0'] = 1;
	if(x <= 100000LL)	return printf("%lld\n", solve(r) - solve(l - 1)), 0;
	ll cnt = 0;
	for(ll i=x;i<=r;i+=x){
        if(i < l)  continue;
		ll j = i, f = 1;
		while(j){
			f = ok[j % 10] ? 1 : 0;
			if(!f)	break;
			j /= 10;
		}
		if(f)	cnt++;
	}
	printf("%lld\n", cnt);
	return 0;
}
2022/9/14 14:01
加载中...