P3805距离
问题描述
对于两个正整数a、b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p,
如果选择变成a/p就要保证p是a的约数,d(a,b)表示将a变成b所需的最少操作次数。
例如d(69,42)=3。
现在给出n个正整数A1,A2,…,An,对于每个i (1<=i<=n),求最小的j(1<=j<=n)使得i≠j且d(Ai,Aj)最小。
输入格式
第一行一个正整数n (2<=n<=100,000)。
第二行n个正整数A1,A2,…,An (Ai<=1,000,000)。
输出格式
输出n行,依次表示答案。
样例输入
6
1
2
3
4
5
6
样例输出
2
1
1
2
1
2
分析一下容易发现,最对于一个数对$(a,b)$最优的变化方法就是$a->gcd(a,b)->b$
那么,如果我们用$cnt[x]$表示$x$所含的质因数的个数,比如$cnt[8]=3$
显然有$d(a,b)=cnt[a]+cnt[b]-2*cnt[gcd(a,b)]$
那么对于一个数$a$我们需要找出最优的$b$
不妨考虑枚举$gcd$,那么$b$是$gcd$的倍数,但是如果枚举$gcd$再枚举$b$显然要超时。
观察发现上式中$cnt[a]$为定值,那么如果我们对于每一个$gcd$处理出使$F[gcd]=cnt[b]-cnt[gcd]$最小的$b$,就能很快解决问题,而这显然是可以预处理出来的,只需要枚举$b$的因数,用$b$更新$F$即可。
注意到不能选到相等的下标,因此我们需要记录最小和次小。
最后,$cnt$可以线性筛预处理出来,$F$可以枚举因数预处理出来,时间复杂度$O(n\times \sqrt{n})$
代码:
1 |
|