蓝桥杯第一场强者挑战赛(C)SOSdp

2023-12-13 06:13:30

之前在cf上面接触过SOSdp(子集dp),这里就碰到了。

??????

思路: 异或运算即非进位加法运算,因此如果a_{i} + a_{j}需要进位的话,那么就无法满足题意,因此条件弱化为a_{i} + a_{j}不需要进位,也就是不存在同一位上面都是1。也就是说,对于a_{i}而言,a_{i}中为1的地方,其他数不能为1,也就是说其对答案的贡献为((1 << 20) - 1) \bigoplus a[i]的子集的个数。

????????

#include <iostream>
using namespace std;
// SOS dp
int dp[(1 << 21)];
#define int long long
const int N = 21;
signed main()
{
	int n;
	cin >> n;
	int a[n];
	for(int i = 0 ; i <n ; i ++){
		cin >> a[i];
		dp[a[i]]++;
	}    
	int ans = 0;
	for(int i = 0;i < N; ++i) {
	    for(int mask = 0; mask < (1 << N); mask++){
	  	  if(mask & (1 << i))
	        dp[mask] += dp[mask^(1 << i)];
		}
	}
	for(int i = 0 ; i < n ; i ++){
	    ans += dp[(1 << N) - 1 - a[i]];
	}
	cout << ans;
  return 0;
}

文章来源:https://blog.csdn.net/weixin_61825750/article/details/134961250
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。