"Oh, I know, I know!" Longge shouts! But do you know? Please solve it.
Input
A number N per line.
Output
Sample Input
2 6
Sample Output
3 15
题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2,n)+gcd(3,n)+…………gcd(n-1,n)+gcd(n,n),(1<=n<2^31)是多少?
欧拉函数
转https://www.cnblogs.com/handsomecui/p/4755455.html
在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n)。
φ函数的值:
φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x
的所有质因数;x是正整数; φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
例如:
φ(10)=10×(1-1/2)×(1-1/5)=4;
1 3 7 9
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
φ(49)=49×(1-1/7)=42;
欧拉函数的性质:
(1) p^k型欧拉函数:
若N是质数p(即N=p), φ(n)= φ(p)=p-p^(k-1)=p-1。
若N是质数p的k次幂(即N=p^k),φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。
(2)mn型欧拉函数
设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3)特殊性质:
若n为奇数时,φ(2n)=φ(n)。
对于任何两个互质 的正整数a,n(n>2)有:a^φ(n)=1 mod n (恒等于)此公式即 欧拉定理
当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod n (恒等于)此公式即 费马小定理
同余定理:
如果 a mod b = c 则有(a+kb) mod b =c(k为非0整数)
如果 a mod b = c 则有(ka) mod b =kc (k为正整数)
(a+b) mod c =((a mod c)+(b mod c )) mod c;
(a*b) mod c=((a mod c)*(b mod c)) mod c
phi(n/i)则为和n最大公约数为i的个数
素数p的欧拉函数值为p-1;
欧拉函数模板
int phi(int n)//直接求
{
int t=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
t=t/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) t=t/n*(n-1);
return t;
}
int p[1000001];
void init()//打表
{
memset(p,0,sizeof(p));
p[1]=1;
for(int i=2;i<1000000;i++)
{
if(p[i]==0)
{
for(int j=i;j<1000000;j+=i)
{
if(p[j]==0)
p[j]=j;
p[j]=p[j]/i*(i-1);
}
}
}
}
题解
#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
ll phi(int n)
{
ll res=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n>1) res=res/n*(n-1);
return res;
}
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
ll ans=0;
for(ll i=1;i*i<=n;i++)//这里是循环了logn
{
if(n%i==0)
{
ans+=i*phi(n/i);//phi(n/i)则为和n最大公约数为i的个数
if(i*i!=n)//让其不重复
{
ans+=n/i*phi(i);//和n最大公约数为n/i的个数
}
}
}
cout<<ans<<endl;
}
return 0;
}
