To_Heart—题解——ABC169 D
题目大意
给定一个正整数
n
n
n,并对它进行若干次操作。
对于每次操作,选择一个正整数
x
x
x,满足
x
=
p
e
x=p^e
x=pe且
x
x
x和其它操作中用过的
x
x
x不一样(每个用一次),
x
x
x为n的因数。其中
p
p
p为质数,
e
e
e为正整数,并将
n
n
n变为
n
x
\frac{n}{x}
xn
问最多操作次数。
首先对
n
n
n进行质因数分解。
n
=
p
1
e
1
×
p
2
e
2
×
.
.
.
×
p
m
e
m
n=p_1^{e_1}\times p_2^{e_2}\times ...\times p_m^{e_m}
n=p1e1×p2e2×...×pmem
对于每一个
p
i
e
i
p_i^{e_i}
piei,可以进一步拆分为:
p
i
e
i
=
p
i
a
1
×
p
i
a
2
×
.
.
.
×
p
i
a
k
i
p_i^{e_i}=p_i^{a_1}\times p_i^{a_2}\times...\times p_i^{a_{k_i}}
piei=pia1×pia2×...×piaki
所以我们要求的就是:
a
n
s
=
∑
i
=
1
m
k
i
ans=\sum_{i=1}^m k_i
ans=i=1∑mki
然后考虑怎么样让 k i k_i ki最大,发现每一个 a i a_i ai尽可能小的时候, k i k_i ki最大。然后就做完了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll,ll> m;
ll tot[100005];
ll len=0;
ll n;
ll ans=0;
int main(){
// for(int i=1;i<=50;i++)
// Fuck
cin>>n;
for(ll i=2;i*i<=n;i++){
if(n%i==0)
tot[++len]=i;
while(n%i==0)
n/=i,m[i]++;
}
if(n>1)
tot[++len]=n,m[n]++;
for(int i=1;i<=len;i++){
ll now=tot[i];
for(int k=1;k<=m[now];k++){
ans++;
m[now]-=k;
}
}
printf("%lld",ans);
// for(int i=1;i<=len;i++)
// printf("%lld %lld\n",tot[i],m[tot[i]]);
return 0;
}