原代码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;
}