线性筛 欧拉筛
线性筛
int prime[maxl]; bool mark[maxl]; int tot; inline void oula() { for(int i=2;i<=maxl;i++) { if(!mark[i])prime[++tot]=i; for(int j=1;j<=tot and i+prime[j]<=maxl;j++){ mark[i*prime[j]]=1; if(i%prime[j]==0)break; } } }
最后一行代码是为了保证不重复。
可以顺便求欧拉函数的φ值。欧拉函数的值φx是x以内与x互素的数的个数。φ是积性函数,性质如下:
若n是素数,φn=n-1。
若n是质数p的k次幂:
φn=pk-pk-1=(p-1)pk-1
若m与n互质:
φ(mn)=φm*φn
若要求单个数的phi值:
#include<iostream> #include<cstdio> #include<cmath> #define ll long long using namespace std; ll n,ans; int m; ll phi(ll x) { ll t=x; for(ll i=2;i<=m;i++) if(x%i==0) { t=t/i*(i-1); while(x%i==0)x/=i; } if(x>1)t=t/x*(x-1); return t; } int main() { scanf("%lld",&n); m=sqrt(n); for(int i=1;i<=m;i++) if(n%i==0) { ans+=(ll)i*phi(n/i); if(i*i<n)ans+=(ll)(n/i)*phi(i); } printf("%lld",ans); return 0; }
如要算出范围内所有的phi值:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const int maxn=1e8; inline int read() { int x=0;char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); return x; } int phi[maxn],prime[maxn>>1],tot,n,ans; bool mark[maxn]; inline void oula() { phi[1]=1; for(int i=2;i<=n;i++) { if(!mark[i]) { prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot and i*prime[j]<=n;j++) { mark[i*prime[j]]=1; if(i%prime[j]==0)phi[i*prime[j]]=phi[i]*prime[j]; else phi[i*prime[j]]=phi[i]*(prime[j]-1);
if(i%prime[j])break; } } } int main() { n=read();
int m=read(); oula(); while(m--)printf("%d\n",prime[read()]); return 0; }
注意φ1=1.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现