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;
}
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· .NET 8 gRPC 实现高效100G大文件断点续传工具
· STM32学会要花费多长时间?一个从机械转行老程序员的血泪史
· LinqPad:C#代码测试学习一品神器
· .NET入行第4年(第二集)
· C#/.NET/.NET Core技术前沿周刊 | 第 43 期(2025年6.16-6.22)