2728: [HNOI2012]与非

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 786  Solved: 371
[Submit][Status][Discuss]

Description

Input

输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述。 100%的数据满足K≤60且N≤1000,0<=Ai<=2^k-1,0<=L<=R<=10^18

Output

仅包含一个整数,表示[L,R]内可以被计算出的数的个数

Sample Input

3 3 1 4
3 4 5

Sample Output

4

HINT

样例1中,(3 NAND 4) NADN (3 NAND 5) = 1,5 NAND 5 = 2,3和4直接可得。

Source

day1

分析:

如果把与非操作换成异或操作应该就是裸的线性基的题目,现在问题就转化为了求与非操作下的线性基...

我们考虑通过与非操作可以得到所有的位运算:

$~A=A nand A$

$A and B=~(A nand B)$

$A orB=~((~A) and (~B))$

$A xor B=(A or B) and (A nand B)$...

然后我们发现所有的位运算,对于某些位置,如果这些位置在每个数字中都相同,那么最后的结果这些位置也是相同的...

而因为我们可以得到所有的位运算所以这些位置最后都可以为$1$,所以我们找出所有相同的位置作为线性基,一组相同的位置是线性基中的一个数...计算出线性基之后随便算一算就好了...

具体找法就是我们选取当前枚举的位置,如果一个数字当前位置为$0$那么把它取反,然后把操作之后的所有数字$and$起来,这样相同的位置一定是$1$...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define int long long
using namespace std; const int maxn=1000+5; int n,k,l,r,cnt,a[maxn],b[maxn],f[maxn]; inline int calc(int x){
if(x==-1)
return -1;
int now=0,ans=0;
for(int i=1;i<=cnt;i++)
if((now|b[i])<=x)
now|=b[i],ans|=(1LL<<cnt-i);
return ans;
} inline void xor_gauss(void){
int lala=(1LL<<k)-1,now;
for(int i=k-1;i>=0;i--)
if(!f[i]){
now=lala;
for(int j=1;j<=n;j++){
if((a[j]>>i)&1)
now&=a[j];
else
now&=~a[j]&lala;
}
b[++cnt]=now;
for(int j=0;j<=i;j++)
if((now>>j)&1)
f[j]=1;
}
} signed main(void){
scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
xor_gauss();
printf("%lld\n",calc(r)-calc(l-1));
return 0;
}

  


By NeighThorn

最新文章

  1. Xml 序列化
  2. WPF The Hard Way
  3. WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌
  4. svn使用svnsync实现双机热备
  5. 详解Android首选项框架ListPreference
  6. (转)十分钟搞定CSS选择器
  7. pthread_setcanceltype 线程取消
  8. NSIndexPath的初始化方法
  9. js open() 与showModalDialog()方法
  10. Android生存指南:Eclipse快捷键
  11. SSI框架总结
  12. maven项目 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
  13. EZ 2018 07 06 NOIP模拟赛
  14. python+win32+ie浏览器操作 TypeError: getElementById() takes exactly 1 argument (2 given)
  15. Android-Kotlin-空值处理&amp;字符串比较&amp;常量
  16. Visual Studio 2013编译Mozilla NPAPI 示例注意事项
  17. Java-web-j2e学习建议路线【转】
  18. 记录日志好习惯——Log4net入门(WCF篇)
  19. UIScrollView中的手势
  20. poj 3128 Leonardo&#39;s Notebook——思路(置换)

热门文章

  1. AngularJS1.X版本双向绑定九问
  2. PS1
  3. composer 类加载器,对 &lt;PSR-4的风格&gt;、&lt;PSR-0的风格&gt;、&lt;PEAR的风格&gt; 风格的类的加载
  4. 深入解析AJAX的原理
  5. 26.VUE学习之--提交表单不刷新页面,事件修饰符之使用$event与prevent修复符操作表单
  6. yii2 RUL的生成
  7. C语言分步编译
  8. Reading comprehension HDU - 4990 (矩阵快速幂 or 快速幂+等比数列)
  9. Unity脚本执行顺序自研框架
  10. java以正确的方式停止线程