Description
若两个数的最大公约数为1,则这两个数互质。现在给出一个正整数N(1<=2^31-1),你的任务是求出1~N中与N互质的数的总和。
Input
一个整数N
Output
一个整数sum,表示1~N中与N互质的数的总和。
Sample Input
10
Sample Output
20
这是道数论题,看起来很简单,但是数据规模颇大。
首先观察题目,题意很浅显,就是要求与1~N中,与N互质的数有多少。
解法1:暴力这不用讲了,只能捞到一点点油水。(额 ~~提前是打得优美)
解法2:自己推。。。
通过无数次的推敲,我们可以发现两个数要是互质的话一般会有Gcd(N,i)=1,可以推成Gcd(N,N-i)=1。这个证明很简单,我们可以通过反证来证明:
假设GCD(N,N-i)=k(k!=1),
那么就必须保证,(n-i)%k==0, N%k==0,
那么就得保证n%k==0.
k是n的因子,如果i%k==0那么GCD(n,i)=k矛盾出现。
于是我们可以得出公式:ans=N*PHI(N)/2
为什么会的出这个公式呢?
基于上面的数论,我们可以发现n,n-i总是成对出现的,而且和为n,所以很容易就推出公式了。
Algorithm: Mathematics Data Structures
Structure:Euler function。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
long long PHI(long long x)
{
long long ANS=x;
for(int i=2;i<=(long long )sqrt(x);i++)
if (x%i==0)
{
ANS=ANS*(i-1)/i;
while (x%i==0) x/=i;
}
if (x>1) ANS=ANS*(x-1)/x;
return ANS;
}
int main()
{
long long n;
scanf("%lld",&n);
long long ans=PHI(n)*n/2;
printf("%lld",ans);
return 0;
}
这道题是值得记录的。里面包含了欧拉函数的计算,与互质方面的知识。
欧拉通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若n是质数p的k次幂,
设n为正整数,以 φ(n)表示不超过n且与n互
素的正整数的个数,称为n的欧拉函数值,这里函数
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是积性函数——若m,n互质, φ(nm)=φ(m)(n)
若n为质数则 φ(n)=n-1;
受益匪浅啊~~~
ps:刚刚使用博客不久东西都不太熟。。。。贴一贴记一下…
行内公式,数学公式为:
Γ(n)=(n−1)!∀n∈N
。
- 块级公式: