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