题解:
我们发现,这题有一点点规律我们可以用塞素数的方法做。
按顺序,每次把没被塞掉的i的倍数全部塞出来(包括i),并且有多少个就加上多少个i,因为这时i是除了1以外他们的最小约数。最后如果全部数都被塞完了,就不用做下去了。注意若i的某个倍数,之前已经被塞出去了,就不用累加i。
var
a:array [0..10000001] of boolean;
n,p,i,j:longint;
sum:int64;
begin
assign(input,'divisor.in'); reset(input);
assign(output,'divisor.out'); rewrite(output);
readln(n);
p:=n-1; sum:=0;
fillchar(a,sizeof(a),true);
i:=1;
while p>0 do
begin
inc(i);
if a[i] then
begin
for j:=1 to n div i do
if a[i*j] then
begin
a[i*j]:=false;
dec(p);
sum:=sum+i;
end;
end;
end;
writeln(sum);
close(input); close(output);
end.