分析題目可以發現,兩個數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示例 ...