求和

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;  
}  

这道题是值得记录的。里面包含了欧拉函数的计算,与互质方面的知识。
欧拉通式:

φ(x)=x(11p1)(11p2)(11p3)......(1d1pn)

其中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)=pkpk1=(p1)(pk1)
,因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以 φ(n)表示不超过n且与n互
素的正整数的个数,称为n的欧拉函数值,这里函数
φ:N→N,n→φ(n)称为欧拉函数。

欧拉函数是积性函数——若m,n互质, φ(nm)=φ(m)(n)

若n为质数则 φ(n)=n-1;

受益匪浅啊~~~

ps:刚刚使用博客不久东西都不太熟。。。。贴一贴记一下…
行内公式,数学公式为: Γ(n)=(n1)!nN
- 块级公式:

x=b±b24ac2a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值