51Nod 1040 最大公約數之和

2021-07-25 05:38:56 字數 1671 閱讀 5631

分析題目可以發現,兩個數gc

d(a,

b)=x

,則等價於gc

d(ax

,bx)

=1,問題就可以轉化為滿足gc

d(nx

,ix)

=1的i的個數,對答案貢獻就是個數乘上gc

d(n,

i)。很容易可以想到尤拉函式,因為φ(

n)是小於等於n的數中與n互質的數的數目,gc

d(nx

,ix)

=1的i的個數就等於φ(

nx) ,那麼x用n√

的時間列舉就好了。

var

p:array[0..50000] of boolean;

s:array[0..50000] of longint;

n,i,j,sum:longint;

ans:int64;

pd:boolean;

procedure

deal;

var i,j,maxn:longint;

begin

maxn:=trunc(sqrt(n));

for i:=2

to maxn do

begin

if p[i]=false

then

begin

inc(s[0]);s[s[0]]:=i;p[i]:=true;

end;

for j:=1

to s[0] do

begin

if i*s[j]>maxn then

break;

p[i*s[j]]:=true;

if i mod s[j]=0

then

break;

end;

end;

end;

function

phi(sum:longint):int64;

begin

phi:=1;

for j:=1

to s[0] do

begin

if sumthen

break;

pd:=false;

while sum mod s[j]=0

dobegin

sum:=sum div s[j];

if pd then phi:=phi*s[j] else phi:=phi*(s[j]-1);

pd:=true;

end;

end;

if sum>1

then phi:=phi*(sum-1);

end;

begin

readln(n);

deal;

for i:=1

to trunc(sqrt(n)) do

if n mod i=0

then

begin

sum:=n div i;

ans:=ans+i*phi(sum);

if i<>sum then ans:=ans+sum*phi(i)

end;

writeln(ans);

end.

51nod 1040 最大公約數之和

1040 最大公約數之和 rihkddd 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n ...

51nod1040最大公約數之和

題目大意 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n n 10 9 output 公約數之和 思路 將n分解質因子,每個質因子貢獻的是多少,累加求和。每個質因子貢獻的次數...

51Nod 1040 最大公約數之和

1040 最大公約數之和 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n n 10 9 實際上應該是n 10 18output 公約數之和input示例 6output示例 ...