Ned 的难题
题目描述
输入格式
输出格式
样例输入
3
4 6 2
样例输出
384
数据范围
题解
首先,显然,某个质数 p 对答案的贡献跟一个子序列里这个质数的次数的最小值有关。
其次,序列里的每一个数分解质因数后,大于
107−−−√
的素数的次数最多为1,对于这类素数分开讨论就可以了。对于 一个素数
p
,如果连续的
对于剩下的那些小于 107−−−√ 的素数分开讨论就可以了,这类的素数不超过1000个。
对于一个小于
107−−−√
的素数
p
,建立一个新数组保存每一个数含有素数
Code(Pascal)
const
mo=1000000009;
jx=3162;
var
ss:array[0..1000] of longint;
f:array[0..jx] of boolean;
a,zs,d:array[0..50000] of int64;
n,m,j,k,l,i,o,p:longint;
ans,kk,gg:int64;
function max(a,b:int64):int64;
begin
if a>b then exit(a)
else exit(b);
end;
function ksm(cqy,t:int64):int64;
var
o:int64;
begin
o:=1;
while t>0 do
begin
if t mod 2=1 then o:=(o*cqy) mod mo;
t:=t div 2;
cqy:=(cqy*cqy) mod mo;
end;
exit(o);
end;
procedure lj(o:longint);
var
i,j,k,l,top:longint;
p,oo:int64;
begin
for i:=1 to n do
begin
zs[i]:=0;
while a[i] mod ss[o]=0 do
begin
inc(zs[i]);
a[i]:=a[i] div ss[o];
end;
end;
top:=2;
d[1]:=0;
d[2]:=1;
p:=zs[1];
oo:=zs[1];
for i:=2 to n do
begin
inc(top);
d[top]:=i;
while (zs[d[top]]<zs[d[top-1]]) and (top>1) do
begin
dec(top);
oo:=oo-(d[top]-d[top-1])*(zs[d[top]]);
d[top]:=d[top+1];
end;
if zs[i]=0 then
begin
oo:=0;
top:=1;
d[top]:=i;
end;
oo:=oo+(i-d[top-1])*zs[i];
p:=p+oo;
end;
ans:=ans*ksm(ss[o],p) mod mo;
end;
begin
assign(input,'ned.in'); reset(input);
assign(output,'ned.out'); rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i]);
p:=max(p,a[i]);
end;
for i:=2 to jx do
if f[i]=false then
for l:=i to jx div i do
f[i*l]:=true;
for i:=2 to jx do
if f[i]=false then
begin
inc(o);
ss[o]:=i;
end;
ans:=1;
for i:=1 to o do
lj(i);
kk:=1;
gg:=1;
for i:=1 to n do
if a[i]=kk then inc(gg)
else
begin
ans:=ans*ksm(kk,gg*(gg+1) div 2) mod mo;
kk:=a[i];
gg:=1;
end;
ans:=ans*ksm(kk,gg*(gg+1) div 2) mod mo;
writeln(ans);
close(input);
close(output);
end.