首页 > 代码库 > 欧拉函数之和(51nod 1239)
欧拉函数之和(51nod 1239)
对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler‘s totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。
S(n) = Phi(1) + Phi(2) + ...... Phi(n),给出n,求S(n),例如:n = 5,S(n) = 1 + 1 + 2 + 2 + 4 = 10,定义Phi(1) = 1。由于结果很大,输出Mod 1000000007的结果。
Input
输入一个数N。(2 <= N <= 10^10)
Output
输出S(n) Mod 1000000007的结果。
Input示例
5
Output示例
10
#include<cstdio> #include<iostream> #define N 2000010 #define ha 2333333 #define mod 1000000007 #define ni 500000004 #define lon unsigned long long using namespace std; int phi[N],prime[N],cnt,tot,head[N],vis[N]; lon n,sum[N]; struct node{int pre;lon x,v;}e[N]; void add(int u,lon v,lon x){ e[++cnt].v=v;e[cnt].x=x;e[cnt].pre=head[u];head[u]=cnt; } void get_prime(){ phi[1]=1; for(int i=2;i<N;i++){ if(!vis[i]) vis[i]=1,prime[++tot]=i,phi[i]=i-1; for(int j=1;j<=tot&&i*prime[j]<N;j++){ vis[i*prime[j]]=1; phi[i*prime[j]]=phi[i]*(prime[j]-1); if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } } } for(int i=1;i<N;i++) sum[i]=(sum[i-1]+phi[i])%mod; } lon solve(lon x){ if(x<N) return sum[x]; lon ans=0,k=x%ha,last; for(int i=head[k];i;i=e[i].pre) if(e[i].v==x) return e[i].x; for(lon i=2;i<=x;i=last+1){ last=x/(x/i); ans=(ans+(last-i+1)%mod*solve(x/i)%mod)%mod; } ans=((x%mod*(x+1)%mod)%mod*ni%mod-ans+mod)%mod; add(k,x,ans); return ans; } int main(){ get_prime(); cin>>n; cout<<solve(n); return 0; }
欧拉函数之和(51nod 1239)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。