1 条题解
-
0
自动搬运
来自洛谷,原作者为

fdszlzl
**搬运于
2025-08-24 22:43:00,当前版本为作者最后更新于2022-11-12 03:55:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意:给定 个 ,求有多少个小于 的非负整数与 异或的结果为质数。
要枚举 ,时间复杂度
要枚举 ,时间复杂度 。百万内的质数有个(几万)。
因为 ,异或后值变小。什么情况异或后值会变小?
设
要想异或后值变小, 必须变成
- 第一个
换言之, 的值都小于
即, 的值小于
现在我们只要算出 有几个质数即可,前缀和。
- 第二个
换言之, 的值都小于
即, 的值小于
现在我们只要算出 有几个质数即可。
总之,若 的第 位为 ,算出 有多少个质数累加即可。
注意,, 有可能超过 。
#include <bits/stdc++.h> using namespace std; const int N=1e7+10; int prime[N],sum[N]; int main() { int n; cin>>n; prime[0]=prime[1]=1; for(int i=2;i<=N-10;i++) { if(prime[i]) continue; for(int j=2;i*j<=N-10;j++) prime[i*j]=1; } for(int i=1;i<=N-10;i++) sum[i]=sum[i-1]+(!prime[i]); for(int i=1;i<=n;i++) { int x,ans=0; cin>>x; for(int j=0;j<=30;j++) if(x&(1<<j)) ans+=sum[(1<<(j+1))-1]-sum[(1<<j)-1]; cout<<ans<<'\n'; } return 0; }
- 1
信息
- ID
- 7349
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者