[模拟试题]最大质因数和
最大质因数和(prime)
题目描述
定义一个数的质因数和为它的所有质因数之和。给出n个正整数,对于每个正整数,输出2到这个数之间所有数中质因数和最大的数的质因数和。
输入格式
第一行一个正整数n(n<=500000),接下来n行每行有一个正整数ai(2<=ai<=1000000)。
输出格式
共n行,对于每一个ai输出符合题意的结果。
样例输入
1
2
样例输出
2
解法:先生成1000000以内所有数的质因数和(利用类似筛法求素数),然后数组s中存最大的质因数和,且有递推式s[i]=max(s[i-1],a[i]),然后读入,再从s中读取
const max=1000000;
var n,m,i,p,t:longint;
a,s,c:array[2..max] of longint;
b:array[2..max] of boolean;
begin
assign(input,'prime.in');reset(input);
assign(output,'prime.out');rewrite(output);
for i:=2 to max do c[i]:=i;
//利用筛法求素数的方法,求所有数的质因数之和
for i:=2 to max do
if not b[i] then
begin
p:=i;
while p<=max do
begin
b[p]:=true;
c[p]:=c[p] div i;
a[p]:=a[p]+i;
p:=p+i;
end;
end
else
if c[i]<>1 then
begin
p:=i;t:=c[i];
while p<=max do
begin
c[p]:=c[p] div t;
a[p]:=a[p]+t;
p:=p+i;
end;
end;
s[2]:=a[2];
for i:=3 to max do
if a[i]>s[i-1] then s[i]:=a[i]
else s[i]:=s[i-1];
readln(n);
for i:=1 to n do
begin
readln(m);
writeln(s[m]);
end;
close(input);close(output);
end.