题目大意
给定一个长度为n的序列,对于序列中的每个正整数数
a
i
{a_i}
ai以及n满足:(
1
≤
a
i
,
n
≤
1
0
6
{1≤a_i,n≤10^6}
1≤ai,n≤106).
求:
Σ
i
=
1
n
Σ
j
=
i
n
p
r
i
m
e
(
a
i
∗
a
i
+
1
∗
.
.
.
∗
a
j
−
1
∗
a
j
)
{\Sigma^n_{i=1}\Sigma^n_{j=i}prime(a_i*a_{i+1}*...*a_{j-1}*a_j)}
Σi=1nΣj=inprime(ai∗ai+1∗...∗aj−1∗aj).
其中
p
r
i
m
e
(
i
)
{prime(i)}
prime(i)为
i
{i}
i含有的不同质因数的个数.
输入样例
10
99 62 10 47 53 9 83 33 15 24
输出样例
248
解题思路
先预处理出
p
r
i
m
e
[
i
]
{prime[i]}
prime[i](即数字i的最小质因数).
通过找规律可以得出:
v
a
l
u
e
[
i
]
=
Σ
j
n
u
m
=
1
(
n
−
i
+
1
)
∗
(
i
−
p
r
e
[
t
j
]
)
{value[i]=\Sigma^{num}_j=1(n-i+1)*(i-pre[t_j])}
value[i]=Σjnum=1(n−i+1)∗(i−pre[tj])
(
v
a
l
u
e
[
i
]
{value[i]}
value[i]为第i个点的总贡献,
t
j
{t_j}
tj为第i个点的权值的第j小的质因数,
n
u
m
{num}
num为其不同质因数个数,
p
r
e
[
i
]
{pre[i]}
pre[i]为i最后出现的位置)
然后维护
p
r
e
[
i
]
{pre[i]}
pre[i]更新
a
n
s
{ans}
ans即可.
参考代码
#include<bits/stdc++.h>
#define N 1001005
#define ll long long
using namespace std;
int n,prime[N];
int pre[N],x;
ll ans=0;
inline void Init()
{
int maxx=1000005;
for(int i=2;i<=maxx;i++){
if(!prime[i])
for(int j=i;j<=maxx;j+=i){
if(!prime[j])
prime[j]=i;
}
}
}
int main()
{
n=in;
Init();
for(int i=1;i<=n;i++)
{
x=in;
while(x>1)
{
int t=prime[x];
while(x%t==0)x/=t;
ans=ans+(ll)(n-i+1)*(i-pre[t]);//核心部分
pre[t]=i;
}
}
printf("%lld\n",ans);
return 0;
}
~咕