欧拉函数の应用;;;

来源:互联网 发布:java.util.date怎么用 编辑:程序博客网 时间:2024/06/06 23:32

Longge 的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:
定一个整数 N ,你需要求出 Σ gcd(i, N)(1<=i<=N) 。

输入描述 Input Description
的第一行包含一个整数 N ,如题所示

输出描述 Output Description
第一行包含一个整数,为所求的答案。

样例输入 Sample Input
6

样例输出 Sample Output
15

数据范围及提示 Data Size & Hint
对于 60% 的数据, 0N<=2^16 。

对于 100% 的数据, 0N<=2^32 。

gcd(i,n)=1 即求N的欧拉函数,gcd(i,n)<>1 即,设 m=gcd(i,n) 就是说m一定为n的约数,所以就要求 有多少个 i满足此式; 因为 gcd(i,n)=m,
gcd(i/m,n/m)=1; i/m与n/m 互质,所以 n/m的欧拉函数就是 i 的个数;然后在用 (i 的个数)*(gcd(i,n));
即 oula(n/m)*m;

program exam1;
var n,m,i,j,s,k:longint;
sum:int64;
function gcd(a,b:longint):longint;
begin
if b=0 then exit(a) else gcd:=gcd(b,a mod b);
end;

function tot(x:longint):int64;
var i,j,k:longint;
begin
k:=x;
tot:=x;
for i:=2 to trunc(sqrt(x)) do
if k mod i=0 then
begin
tot:=tot-tot div i;
while k mod i=0 do k:=k div i;
if k=1 then break;
end;
if (k<>1)and(k<>x) then begin tot:=tot-tot div k; k:=1; end; ////最后不要忘了判断;;;最后一个质因子;;;
if k<>1 then dec(tot);
end;

begin
readln(n);
sum:=n;
for i:=2 to trunc(sqrt(n)) do //到算数平方根;
if n mod i=0 then
begin
k:=n div i;
sum:=sum+tot(i)*k; // i:=n/k;
if n div i<>i then
sum:=sum+tot(k)*i;// k:=n/i;
end;
sum:=sum+tot(n); //gcd(i,n)=1; 时的结果;
writeln(sum);
end.

0 0
原创粉丝点击