78 pts WA 飞求助
查看原帖
78 pts WA 飞求助
363036
chlchl楼主2022/9/22 20:28

感觉代码没什么毛病了啊,但是 7878 分好多次了。

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

const int N = 18 + 10;
ll l, r, dgt[N], f[N][2][13][13];

ll dp(int len, int op, int is0, ll lst1, ll lst2){
	if(!len)	return !is0;
	if(!is0 && f[len][op][lst1][lst2] != -1)	return f[len][op][lst1][lst2];
	ll cnt = 0; int k = (op ? dgt[len] : 9);
	for(int d=0;d<=k;d++){
		if(d == lst1 || d == lst2)	continue;
		cnt += dp(len - 1, op & (d == k), is0 & (!d), d, lst1);
	}
	if(!is0)	f[len][op][lst1][lst2] = cnt;
	return cnt;
}

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

int main(){
	scanf("%lld%lld", &l, &r);
	printf("%lld\n", solve(r) - solve(l - 1));
	return 0;
}
2022/9/22 20:28
加载中...