#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=4e6+100; int phi[maxn]; int prime[maxn]; int visit[maxn]; int tot=0; int num[maxn]; int ans[maxn]; void build_phi(int n) { phi[1]=1; for(int i=2;i<=n;i++) { if(!visit[i]) { prime[++tot]=i; phi[i]=i-1; } for(int j=1;j<=tot && i*prime[j]<=n;j++) { visit[i*prime[j]]=1; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } else { phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } } void solve(int n) { for(int i=1;i<=n;i++) for(int j=i*2;j<=n;j+=i) num[j] += phi[j/i]*i; for(int i=2;i<=n;i++) { ans[i]=ans[i-1]+num[i]; } } int32_t main() { build_phi(maxn); solve(maxn); //cout<<phi[1000000]<<endl; int n; while(cin>>n&&n) { cout<<ans[n]<<endl; } return 0; }
本文详细介绍了一种基于C++的数论算法实现,通过构建欧拉函数表和求解特定数学问题,展示了如何利用数论原理进行高效计算。文章提供了完整的代码示例,包括欧拉函数的构建、累加求和等关键步骤,适用于竞赛编程和数学问题求解。
277

被折叠的 条评论
为什么被折叠?



