[CF1245F] Daniel and Spring Cleaning
题目描述:
给定\(l,r\),求
\[\sum_{a=l}^r\sum_{b=l}^r[a+b=a\oplus b]
\]
解题思路:
设计状态 f[n][lim1][lim2] 表示到第 \(n\) 位,\(a\) 是否到达上界,\(b\) 是否到达上界,转移显然。
代码实现:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[32][2][2], a[32], b[32];//第i位,a是否到达上界,b是否到达上界
int dfs(int n, int lim1, int lim2){
if(n == 0) return 1;
if(f[n][lim1][lim2] != -1) return f[n][lim1][lim2];
f[n][lim1][lim2] = 0;
for(int x = 0; x <= (lim1 ? a[n] : 1); x++){
for(int y = 0; y <= (lim2 ? b[n] : 1); y++){
if((x & y) == 1) continue;
f[n][lim1][lim2] += dfs(n - 1, lim1 & (x == a[n]), lim2 & (y == b[n]));
}
}
return f[n][lim1][lim2];
}
int calc(int x, int y){
if(x < 0 || y < 0) return 0;
memset(f, -1, sizeof f);
for(int i = 1; i <= 30; i++) a[i] = ((x >> (i - 1)) & 1), (b[i] = (y >> (i - 1)) & 1);
return dfs(30, 1, 1);
}
void solve(){
int l, r;
cin >> l >> r;
cout << calc(r, r) - 2 * calc(l - 1, r) + calc(l - 1, l - 1) << endl;
}
signed main(){
int T;
cin >> T;
while(T--) solve();
return 0;
}

浙公网安备 33010602011771号