JZOJ 1164.求和

来源:互联网 发布:征兵心理测试软件 编辑:程序博客网 时间:2024/05/14 18:05

Description

给出一个正整数N(1<=2^31-1),求1~N中与N互质的数的总和。

Sample Input

10

Sample Output

20

Solution

介绍欧拉函数

φ(n)表示是小于或等于n的正整数中与n互质的数的数目。
φ(n)=n(1-1/p1)(1-1/p2)(1-1/p3)….(1-1/pn)其中p1, p2,p3……pn为n的所有质因数(且每种质数只有一个),n≠0.

证明

若n=πp^ap(p|n)(ap表示质因数p的指数,p|n表示p能被a整除)
则φ(n)=π(p-1)p^(ap-1)=nπ(1-1/p)
对任何两个互质的正整数a, m(m>=2)有a^φ(m)≡1(mod m)即欧拉定理。
当m是质数p时,a^(p-1)≡1(mod m) 即费马小定理。

欧拉函数代码

function phi(n:longint):longint;begin    ans:=n;    p:=1;    while (p*p<=n) do    begin        inc(p);        if n mod p=0 then        begin            ans:=ans div p*(p-1);            while n mod p=0 do n:=n div p;        end;    end;    if n>1 then ans:=ans div n*(n-1);end;

其实别人还有比我的这个代码更加优的,我打算去学习别人的方法,但这串代码保证AC。
至于答案sum=φ(n)*n/2

Code

var i,j,k,l,n,m,t,s,p,ans:longint;begin    readln(n);    k:=n;    ans:=n;    p:=1;    while (p*p<=k) do    begin        inc(p);        if k mod p=0 then        begin            ans:=ans div p*(p-1);            while k mod p=0 do k:=k div p;        end;    end;    if k>1 then ans:=ans div k*(k-1);    writeln(ans*n div 2);end.

看来要好好学习一下数论了。
——2016.2.17

4 0
原创粉丝点击