求助,为什么是最劣解
查看原帖
求助,为什么是最劣解
131591
蒟蒻君HJT泽渡透香楼主2022/9/21 22:56

感觉写的没那么丑啊······

#include <bits/stdc++.h>
long long l, r, z;
int n;
const int mod = 1e9 + 7;
inline int add(int x, int y){
	return (x + y >= mod) ? x + y - mod : x + y;
}
inline int mul(int x, int y){
	return (int)(1ll * x * y % (1ll * mod));
}
inline int minus(int x, int y){
	return x < y ? x - y + mod : x - y;
}
int C[1005][1005];
int dp[62][2048][2];
int solve(long long b){
	memset(dp, 0, sizeof dp);
	dp[0][0][0] = 1;
	for(long long w = 0; w <= 60; ++w){
		for(int j = 0; j < (1 << 11); ++j){
			int st = (z & (1ll << w)) == 0ll ? 0 : 1;
			for(int k = st; k <= n; k += 2){
				int p = (j + k) % 2, q = (j + k) / 2;
				int g = mul(dp[w][j][1], C[n][k]);
				int h = mul(dp[w][j][0], C[n][k]);
				if(p && (b & (1ll << w))){
					dp[w + 1][q][1] = add(dp[w + 1][q][1], g);
					dp[w + 1][q][0] = add(dp[w + 1][q][0], h);
				}
				else if(p && !(b & (1ll << w))){
					dp[w + 1][q][1] = add(dp[w + 1][q][1], g);
					dp[w + 1][q][1] = add(dp[w + 1][q][1], h);
				}
				else if(!p && (b & (1ll << w))){
					dp[w + 1][q][0] = add(dp[w + 1][q][0], g);
					dp[w + 1][q][0] = add(dp[w + 1][q][0], h);
				}
				else {
					dp[w + 1][q][1] = add(dp[w + 1][q][1], g);
					dp[w + 1][q][0] = add(dp[w + 1][q][0], h);
				}
			}
		}
	}
	return dp[61][0][0];
}
signed main(){
	scanf("%d%lld%lld%lld", &n, &l, &r, &z);
	for(int i = 0; i <= 1000; ++i) C[i][0] = 1;
	for(int i = 1; i <= 1000; ++i){
		for(int j = 1; j <= 1000; ++j){
			C[i][j] = add(C[i - 1][j - 1], C[i - 1][j]);
		}
	}
	printf("%d\n", minus(solve(r), solve(l - 1)));
	return 0;
}
2022/9/21 22:56
加载中...