求助
查看原帖
求助
627952
jszzx21yaj楼主2024/5/18 07:51

原代码WA on 4
po改long long就过了
这是为什么呢?
它好像不会爆int吧

#include <bits/stdc++.h>
using namespace std;
using i64=long long;
const int N=6e1+5,mod=998244353;
int T;
int k,ans;
i64 l,r;
int a[25];
i64 po[25];
struct node{
	int s,cnt;
	node operator+(const node &a)const{
		return {(s+a.s)%mod,(cnt+a.cnt)%mod};
	}
}dp[25][1<<10];
inline node dfs(int pos,int st,int lim,int o){
	if(!pos) return {0,__builtin_popcount(o)<=k};
	if(st&&!lim&&dp[pos][o].cnt!=-1) return dp[pos][o];
	int ma=lim?a[pos]:9;
	node ret={0,0};
	for(int i=0;i<=ma;i++){
		node t=dfs(pos-1,st||i,lim&&i==ma,(st||i)?(o|(1<<i)):o);
		ret=(ret+node{(1ll*i*po[pos]%mod*t.cnt%mod+t.s)%mod,t.cnt});
	}
	if(st&&!lim) dp[pos][o]=ret;
	return ret;
}
int sol(i64 x){
	a[0]=0;
	for(;x;x/=10) a[++a[0]]=x%10;
	for(int i=1;i<=18;i++) 
		for(int j=0;j<(1<<10);j++) 
			dp[i][j].cnt=-1;
	return dfs(a[0],0,1,0).s;
}
void solve(){
	po[1]=1;
	for(int i=2;i<=19;i++) po[i]=po[i-1]*10%mod;
	cin>>l>>r>>k;
	cout<<(sol(r)-sol(l-1)+mod)%mod;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	T=1;
	while(T--) solve();
	return 0;
}
2024/5/18 07:51
加载中...