[模拟试题]最大质因数和

最大质因数和(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.

原文地址:https://www.cnblogs.com/nbalive2001/p/2015600.html