Prime sieving and Integer blocking
一、Prime number sieve method
1.埃氏筛O(nloglogn)
从 2 开始,2是质数,那么2的倍数:4、6、8、10、12、14、16... 肯定不是质数
3是质数,那么3的倍数:6、9、12、15、18、21..... 肯定不是质数
4已经被筛去了(即被置为false),不是质数,那么4的倍数肯定被它的因子筛过,所以4不用看,跳过
... ...
没有被筛去的一定是质数,因为它没有被比它小的任何一个数筛去,说明它不是任何一个数的倍数,所以一定是质数。
| #include <iostream> |
| using namespace std; |
| #include <cstring> |
| |
| const int N = 1e5; |
| bool isPrime[N + 5]; |
| int primes[N + 5]; |
| int cnt = 0; |
| |
| void aiPrime() |
| { |
| memset(isPrime,true,sizeof(isPrime)); |
| |
| for (int i = 2;i <= N / i;i++) |
| { |
| if (isPrime[i]) |
| { |
| for (int j = i * i; j <= N; j += i) |
| { |
| isPrime[j] = false; |
| } |
| } |
| } |
| |
| for (int i = 2; i <= N; i++) |
| { |
| if(isPrime[i]) |
| primes[cnt++] = i; |
| } |
| } |
| |
| int main() |
| { |
| aiPrime(); |
| cout << cnt << endl; |
| return 0; |
| } |
2.线性筛
| #include<bits/stdc++.h> |
| using namespace std; |
| typedef long long ll; |
| const int maxn =1000010; |
| bool is_pri[maxn]; |
| int pri[maxn]; |
| int cnt; |
| |
| void init(int n) |
| { |
| memset(is_pri, true, sizeof(is_pri)); |
| is_pri[1] = false; |
| cnt = 0; |
| for (int i = 2; i <= n; i++) |
| { |
| if (is_pri[i]) |
| pri[++cnt] = i; |
| for (int j = 1; j <= cnt && i * pri[j] <= n; j++) |
| { |
| is_pri[i * pri[j]] = false; |
| if (i % pri[j] == 0)break; |
| } |
| } |
| } |
| |
3.区间筛
给两个数字,求中的所有素数。
为了防止输出过大和防止打表,
给定,,输出这些素数的异或和。
| #include<bits/stdc++.h> |
| using namespace std; |
| typedef long long ll; |
| typedef unsigned int u64; |
| const int N =10000100; |
| bool is_pri[N]; |
| int pri[N/5]; |
| int cnt; |
| ll l,r; |
| bool vis[N]; |
| u64 ans = 0,a,b; |
| void init(int n) |
| { |
| memset(is_pri, true, sizeof(is_pri)); |
| is_pri[1] = false; |
| cnt = 0; |
| for (int i = 2; i <= n; i++) |
| { |
| if (is_pri[i]) |
| pri[++cnt] = i; |
| for (int j = 1; j <= cnt && i * pri[j] <= n; j++) |
| { |
| is_pri[i * pri[j]] = false; |
| if (i % pri[j] == 0)break; |
| } |
| } |
| } |
| |
| |
| |
| int main() |
| { |
| init(N); |
| cin>>l>>r>>a>>b; |
| for(int i = 1;i<=cnt;i++) |
| { |
| int p = pri[i]; |
| |
| |
| |
| for(ll x = r/p*p;x>=l&&x>p;x-=p) |
| vis[x-l] = 1; |
| |
| } |
| |
| for(ll i = max(2ll,l);i<=r;i++) |
| { |
| if(!vis[i-l]) |
| { |
| ans = ans^(a*(u64)i+b); |
| } |
| } |
| cout<<ans<<endl; |
| return 0; |
| } |
二、Integer_block
整数分块核心代码
| for(ll l = 1;l<=n;l++) |
| { |
| ll d = n/l,r = n/d; |
| |
| l = r; |
| } |
eg1.
| |
| |
| #include<bits/stdc++.h> |
| using namespace std; |
| typedef unsigned long long u64; |
| |
| |
| |
| u64 n,sum; |
| |
| int main() |
| { |
| cin>>n; |
| for(u64 l = 1;l<=n;l++) |
| { |
| u64 d = n/l,r = n/d; |
| sum += (n-l*d+n-r*d)*(r-l+1)/2; |
| l = r; |
| } |
| cout<<sum%(1ull<<60)<<endl; |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现