求助,TLE#10
查看原帖
求助,TLE#10
821939
zhi_hui_kan_ti_jie楼主2023/7/19 19:58
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 10;
const int mod =  998244353;

int ans[maxn];
int cnt[10];
int vaild;
int a[100];
inline int add(int i)
{
	cnt[i]++;
	if (cnt[i] == 1)return 1;
	return 0;
}
inline int del(int i)
{
	cnt[i]--;
	if (cnt[i] == 0)return -1;
	return 0;
}
int k;
struct node
{
	int tim, sum;
	bool operator==(node a)
	{
		return tim == a.tim&&sum == a.sum;
	}
};
node dp[64][1025][20][2][2];
int P[20];
long long qpow(long long a, long long b)
{
	/*if (b == 0)
		return 1;
	if (b == 1)
		return a;
	long long tmp = qpow(a, b / 2);
	tmp *= tmp;
	tmp %= mod;
	if (b % 2 != 0)
		tmp *= a;
	return tmp%mod;*/
	return P[b];
}
node dfs(int num, int now,int last,int info, int top, int p0)
{
	if (last > k)return{0,0};
	if (num == 0)
	{
		if (p0) return{ 0, 0 };
		else return{ last<=k?1:0, now};
	}
	if (dp[num][info][last][top][p0].sum != -1)
		return dp[num][info][last][top][p0];
	int bound = top ? a[num] : 9;
	node res = { 0, 0 };
	for (int i = 0; i <= bound; i++)
	{
		if (p0&&i == 0)
		{
			node tmp = dfs(num - 1,i,last,info, top && (bound == i), p0);
			res.sum += tmp.sum;
			res.tim += tmp.tim;
		}
		else
		{
			last+=add(i);
			if (last > k)
			{
				last += del(i);
				continue;
			}
			node tmp = dfs(num - 1,i,last,info|(1<<i), top && (bound == i), 0);
			res.sum += (((qpow(10, num)*now%mod)*(tmp.tim%mod) + tmp.sum%mod) % mod+mod)%mod;//(((int)pow(10, num) % mod*now%mod*tmp.tim%mod + tmp.sum) % mod + mod) % mod;
			res.tim += tmp.tim;
			res.sum %= mod;
			res.tim %= mod;
			last += del(i);
		}	
	}
	if (dp[num][info][last][top][p0].tim != -1)
		dp[num][info][last][top][p0] = res;
	return res;
}
int solve(unsigned long long l)
{
	int len = 0;
	while (l)
	{
		a[++len] = l % 10;
		l /= 10;
	}
	return (dfs(len, 0,0,0,1, 1).sum%mod+mod)%mod;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	memset(dp, -1, sizeof(dp));
	int t = 1;
	P[1] = 10;
	for (int i = 2; i <= 18; i++)
		P[i] = 10 * P[i - 1] % mod;
	while (t--)
	{
		unsigned long long l, r;
		cin >> l >> r>>k;
		cout << ((solve(r)-solve(l-1))%mod+mod)%mod<<'\n';
	}
	return 0;
}
2023/7/19 19:58
加载中...