Luogu P4932 浏览器(二进制)
题意
题目背景
__stdcall
在用\(Edge\)玩\(slay\)的时候,鼠标会经常失灵,这让她十分痛苦,因此她决定也要让你们感受一下\(Edge\)制造的痛苦。
题目描述
__stdcall
给了你\(n\)个点,第\(i\)个点有权值\(x[i]\),对于两个点\(u\)和\(v\),如果\(x[u]\ xor\ x[v]\)的结果在二进制表示下有奇数个\(1\),那么在\(u\)和\(v\)之间连接一个\(Edge\),现在__stdcall
想让你求出一共有多少个\(Edge\)。
如果你没能成功完成任务,那么__stdcall
会让你痛苦一下,你这个测试点就没分了。
输入输出格式
输入格式:
一行六个整数,\(n,a,b,c,d,x[0]\)。
\(n\)是点的个数,每个点的权值需要用如下的方式生成。
你需要使用\(a,b,c,d\)和\(x[0]\)生成一个数组\(x\),生成方式是这样的。
\]
\(x[i]\)就是第\(i\)个点的权值,点的标号是\(1\)到\(n\)。
输出格式:
输出一个整数,表示一共有多少个\(Edge\)。
输入输出样例
输入样例#1:
8 98 24 20 100 44
输出样例#1:
12
输入样例#2:
1000 952537 601907 686180 1000000 673601
输出样例#2:
249711
说明
我们用\(v\)表示权值中的最大值。
对于前\(20\%\)的数据,\(n\leq 10\)。
对于前\(40\%\)的数据,\(n\leq 100\)。
对于前\(60\%\)的数据,\(n\leq 1000\)。
对于前\(80\%\)的数据,\(n\leq 1e6\)。
对于前\(90\%\)的数据,\(v\leq 1e6\)。
对于\(100\%\)的数据,\(n\leq 1e7,v\leq1e9\)。
保证\(a,b,c,d,x[0]\)都是\(int\)内的非负整数。
思路
O(n^2)做法:
我们直接把\(x\)数组搞出来,然后暴力两两匹配看两者的异或值的二进制表示是否只有一个\(1\),逐个统计答案。
O(n)做法:
这题的做法是真的好玩。其实就是一个结论:两个数字的异或值在二进制表示下为奇数,当且仅当两个数字的二进制表示中\(1\)的个数一个为奇数,一个为偶数。
比如说两个偶数\(a,b\),它们的二进制表示下有\(x\)位同为\(1\),有\(y\)位\(a\)是\(1\)而\(b\)是零,有\(z\)位\(a\)是\(0\)而\(b\)是\(1\),那么\((x+y)\mod 2=0\),且\((x+z)\mod 2=0\),所以有\((x+y+x+z)\mod 2=0\),也就是\((y+z)\mod 2=0\)。其他情况证明相同。
所以只需要统计出所有数中二进制表示中\(1\)的个数为奇数的数的个数与为偶数的数的个数,相乘得到答案。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,a,b,c,d,ans[2],x;
LL read()
{
LL re=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
int main()
{
n=read(),a=read(),b=read(),c=read(),d=read(),x=read();
a%=d,b%=d,c%=d,x%=d;
for(LL i=1;i<=n;i++) x=(a*x%d*x%d+b*x%d+c)%d,ans[__builtin_popcount(x)&1]++;
printf("%lld",ans[0]*ans[1]);
return 0;
}
Luogu P4932 浏览器(二进制)的更多相关文章
- P4932 浏览器(统计二进制1的个数)
P4932 浏览器 有\(n\)个数,\(x_1,x_2,\cdots,x_n\),问你有多少对\((u,v)\),使得\(x_u\operatorname{xor}x_v\)的二进制表示中有奇数个\ ...
- 洛谷——P4932 浏览器
P4932 浏览器 __stdcall给了你n个点,第i个点有权值x[i],对于两个点u和v,如果x[u] xor x[v]的结果在二进制表示下有奇数个1,那么在u和v之间连接一个Edge,现在__s ...
- luogu P4428 [BJOI2018]二进制
luogu 先考虑怎样的二进制串才会被3整除.可以发现如果二进制位第\(0,2,4...2n\)位如果为\(1\),那么在模3意义下为1,如果二进制位第\(1,3,5...2n+1\)位如果为\(1\ ...
- P4932 浏览器
题目背景 __stdcall在用Edge玩slay的时候,鼠标会经常失灵,这让她十分痛苦,因此她决定也要让你们感受一下Edge制造的痛苦. 题目描述 __stdcall给了你n个点,第i个点有权值x[ ...
- 洛谷 P4932 浏览器 (思维题)
题目大意:给你一个序列,求满足$x_{i}\: xor\; x_{j}$在二进制下1的数量为奇数的数对数量 打月赛的时候真没想出来,还是我太弱.. xor意义下,对于两个数,假设它们两个每一位都是2个 ...
- [LUOGU]4932 浏览器
\(\_\_stdcall\)大佬出的题\(Orz\) 我们惊奇地发现,加入\(\_\_popcount(x)\)和\(\_\_popcount(y)\)的奇偶数性相同,那么\(\_\_popcoun ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- Javascript的二进制数据处理学习 ——nodejs环境和浏览器环境分别分析
以前用JavaScript主要是处理常规的数字.字符串.数组对象等数据,基本没有试过用JavaScript处理二进制数据块,最近的项目中涉及到这方面的东西,就花一段时间学了下这方面的API,在此总结一 ...
- 框架基础:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...
随机推荐
- Google Projectsheet Planning 插件的WBS
生成 WBS的序列號 在 Sldebar中的 "WBS" 按鈕: "< WBS" 取消下級目錄 "WBS >" 生成下級目錄 G ...
- 剑指Offer-16:合并两个有序链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 例如A链表为1-3-5-7,B链表为2-4-6-8.所以合并后的新链表C为1-2-3-4-5- ...
- 概率dp——逆推期望+循环迭代zoj3329
首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...
- 将文件大小数值转换成B、KB、MB、GB
//delphi 将文件大小数值转换成B/KB/MB/GB function FormatByteSize(const bytes: Longint): string; const B = 1; // ...
- bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)
传送门 解题思路 看到最大,肯定要先想二分答案.二分之后首先从小到大枚举\(k\)个小于\(lim\)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生 ...
- python用类实现装饰器
一.代码 #利用__call__方法,装饰器的执行流程:当添加装饰器语法糖时,会把语法糖的变量名加()执行,并将被装饰的函数名传入.所以当类加()执行时,执行了__init__,产生的对象就是被装饰的 ...
- Seam科普
声明:这是引用的,具体引用位置在最下面. 只供个人学习,免得忘记了又要到处找,十分感谢原作作者.如果有什么问题请联系我. Seam框架开发一个HelloWrld的例子. Seam本身,而在于Seam使 ...
- 02-python 学习第二天
今天学习了以下几个方面的内容,虽然部分内容不能理解,跟着老师写出了代码. 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 程序练习1:购物车程序 请闭眼写出以下程序. 程序: ...
- <数据可视化>Matplotlib(2D+3D)
1.Matplotlib介绍(2D) Matplotlib 是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式. pylab 是 matplo ...
- 实现ViewPager的联动效果
参考链接:android - Synchronizing two ViewPagers using OnPageChangeListener - Stack Overflow 其中有个非常完美的解决方 ...