欧拉函数の应用;;;

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值