求助,一直wa第十个点
  • 板块CF1073E Segment Sum
  • 楼主luoyx
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/18 15:05
  • 上次更新2023/10/23 21:15:27
查看原帖
求助,一直wa第十个点
520056
luoyx楼主2023/3/18 15:05

怀疑是取模的问题

#include <bits/stdc++.h>
using namespace std;
#define int long long
int K,L,R;
const int N=25;
int dp[N][N][2070],f[N][N][2070];
const int mod=998244353;
int mx=(1<<11)-1;
int chk[2070];
int bt(int x){
	int cnt=0;
	while(x){
		cnt+=(x&1);
		x>>=1;
	}
	return cnt;
}
void init(){
	for(int i=0;i<=9;i++){
		dp[1][i][(1<<i)]=i;
		f[1][i][(1<<i)]=1;
	}
	for(int i=2;i<=20;i++){
		for(int j=0;j<=9;j++){
			for(int k=0;k<=9;k++){
				for(int l=0;l<=mx;l++){
					dp[i][j][l|(1<<j)]+=dp[i-1][k][l];
					dp[i][j][l|(1<<j)]+=j*f[i-1][k][l]*pow(10,i-1);
					f[i][j][l|(1<<j)]+=f[i-1][k][l];
					dp[i][j][l|(1<<j)]%=mod;
					f[i][j][l|(1<<j)]%=mod;
				}
			}
		}
	}
	for(int i=0;i<=mx;i++){
		chk[i]=bt(i);
	}
}
int a[N];
int calc(int x){
	int len=0,ans=0;
	while(x){
		a[++len]=x%10;
		x/=10;
	}
	for(int i=len-1;i>=1;i--){
		for(int j=1;j<=9;j++){
			for(int k=0;k<=mx;k++){
				if(chk[k]<=K) ans+=dp[i][j][k];
				ans%=mod;
			}
		}
	}
	for(int i=1;i<a[len];i++){
		for(int j=0;j<=mx;j++){
			if(chk[j]<=K) ans+=dp[len][i][j];
			ans%=mod;
		}
	}
	int cnt=(1<<a[len]),pr=a[len]*pow(10,len-1);
	for(int i=len-1;i>=1;i--){
		for(int j=0;j<a[i];j++){
			for(int k=0;k<=mx;k++){
				if(chk[(cnt|k)]<=K){
					ans+=dp[i][j][k];
					ans+=f[i][j][k]*pr;
					ans%=mod;
				} 
			}
		}
		pr+=a[i]*pow(10,i-1);
		pr%=mod;
		cnt|=(1<<a[i]);
	}
	return ans%mod;
}
signed main(){
	init();
	cin>>L>>R>>K;
	cout<<((calc(R+1)-calc(L))%mod+mod)%mod;
}

2023/3/18 15:05
加载中...