ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】CF1614C Divan and bitwise operations

2021-11-28 11:32:48  阅读:190  来源: 互联网

标签:operations limits 题解 sum 一位 Divan include ll times


题目传送门

正解

思路

先考虑对于 x 的限制怎么处理。

因为 \(l \sim r\) 使用来连接,所以如果 x 中的某一位是0,则要求该区间内的每一个数的这一位都得是 0 。

那么,先默认每个数的每一位都是 1 ,再用这 m 个限制搞一搞即可。

主要的难点在于统计答案。

首先,我们知道,对于每个子序列的答案的某一位,当且仅当有奇数个数的这一位是 1 ,然后选择 1 的方案就是 \(C^1_x+C^3_x+C^5_x+...+C^{x-(!(x\& 1))}_x\) (x 表示这一位的 1 的个数),而每一个 0 可选可不选,那么选 0 总方案就是 \(2^{n-x}\)。

显然,这样的复杂度是 \(\Theta(过不了)\),需要进行优化。

组合数是有以下性质的:

  1. \(C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1}\)

  2. \(\sum\limits^n_{i=0}C^i_n=2^n\)

根据性质 1,将 \(C^1_x+C^3_x+C^5_x+...+C^{x-(!(x\& 1))}_x\) 中的每一个组合数拆分,可以将其变成 \(\sum\limits^{x-1}_{i=0}C^i_{x-1}\) ,也就把它变成了 \(2^{x-1}\) ,最终的总选择方案就是 \(2^{x-1}\times 2^{n-x}\) ,其实这样就可以过了,不过你可以把它变成 \(2^{n-1}\) ,进行进一步优化。

这以后,最终答案就是 \(\sum\limits_{i=0}^n2^{n-1}\times 2^i\) ,然后将 \(2^{n-1}\) 提出来,得到 \(2^{n-1}\times \sum\limits_{i=0}^n2^i\) 不过显然我们算的是选 1 的方案,所以如果这一位没有就不计贡献。

等下,“这一位”指的是什么?其实就是将所有的 x 起来以后的“这一位”(我们把它称作 sum),那么很好理解,“这一位”是 0 不会产生贡献,而是 1 应该产生贡献,所以对于 “\(2^i\)” ,它需要乘上 \(2^{n-1}\) 以计入答案当且仅当 i “这一位”是 1 。

然后,这个就相当于将 \(2^{n-1}\) 乘上了一个 sum!!!

然后,l 和 r 就卵用没有了!!!

输出的时候,就只需要输出 \(2^{n-1} \times sum\) 了!!!

然后就做完了!!!

复杂度 \(\Theta(Tn)\) !!!

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;const ll MO(1e9+7);ll T,n,m,sum,l,r,x,tww;
int main(){
	scanf("%lld",&T);
	while(T--){
		tww=1;sum=0;scanf("%lld",&n,&m);
		for(int i=1;i<n;++i) tww=(tww<<1)%MO;
		for(int i=1;i<=m;++i){scanf("%lld%lld%lld",&l,&r,&x);sum|=x;}
		printf("%lld\n",(1ll*sum*tww)%MO);
	}
	return 0;
}

标签:operations,limits,题解,sum,一位,Divan,include,ll,times
来源: https://www.cnblogs.com/Konjac-Binaries/p/15614606.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有