萌新刚学OI,0pts请求DEBUG
  • 板块CF1073E Segment Sum
  • 楼主Hisy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/23 20:33
  • 上次更新2024/7/23 21:30:39
查看原帖
萌新刚学OI,0pts请求DEBUG
922691
Hisy楼主2024/7/23 20:33
#include<bits/stdc++.h>
#define MAXN 20
#define MAXM 1024
#define MOD 998244353
using namespace std;
typedef long long ll;
int k,f[MAXN][2][2][MAXM];
ll dp[MAXN][2][2][MAXM];
inline ll clac(string S){
	memset(f,0,sizeof(f));
	memset(dp,0,sizeof(dp));
	ll ans=0;
	f[0][0][0][0]=1;
	for(size_t o=0;o<S.size();++o){
		for(int x=0;x<=1;++x){
			for(int y=0;y<=1;++y){
				for(int bit=0;bit<1024;++bit){
					if(f[o][x][y][bit]){
						int cnt=f[o][x][y][bit];
						ll sum=dp[o][x][y][bit];
						int limit=S[o]-'0';
						if(x){
							limit=9;
						}
						for(int i=0;i<=limit;++i){
							int nxtbit=bit;
							if(y||i){
								nxtbit|=(1<<i);
							}
							(f[o+1][x||(i<limit)][y||i][nxtbit]+=cnt)%=MOD;
							(dp[o+1][x||(i<limit)][y||i][nxtbit]+=cnt*i+sum*10)%=MOD;
						}
					}
				}
			}
		}
	}
	for(int x=0;x<=1;++x){
		for(int y=0;y<=1;++y){
			for(int i=0;i<1024;++i){
				if(__builtin_popcount(i)<=k){
					(ans+=dp[S.size()-1][x][y][i])%=MOD;
				}
			}
		}
	}
	return ans;
}
int main(){
	ll l,r;
	scanf("%lld %lld %d",&l,&r,&k);
	ll x=clac(to_string(r)),y=clac(to_string(l-1));
	printf("%lld",((x-y)%MOD+MOD)%MOD);
	return 0;
}
2024/7/23 20:33
加载中...