链接P3532 [POI2012]ODL-Distance

  • 设\(f_{i,j}\)表示他给定的函数,\(g_i\)表示\(i\)的质因数个数

  • 那么$$f_{i,j}=g_{\frac {i*j}{gcd^2}}$$

  • 考虑线性筛\(g_i\)。

  • 那么对于每一个数\(w_i\)考虑枚举他的因子作为\(gcd\)。

  • 也就是枚举\(x\),对于\(x\),枚举所有\(x\)的倍数\(y\)。

  • 所以我们预处理出\(h_x\)表示\(x\)和他的倍数中,\(f_x\)的最小值的编号。

  • 但是我们在计算\(i\)这个数的答案的时候,不能用\(i\)来更新本身。

  • 所以在设\(p_x\)表示\(x\)和他的倍数中,\(f_x\)的次小值的编号。

  • 所以在更新每个位置的答案的时候,我们枚举\(gcd\),然后再枚举\(gcd\)的\(h_x\)和\(p_x\)。

  • 假设当前值是\(a\),如果\(h_x\)是本身,就用\(p_x\)和\(a\)去更新答案,否则就用\(h_x\)去更新答案。

  • 即\(f_{i,j}=g_i+g_j-2*g_{gcd}\)

  • 这样虽然不能保证\(x\)是\(a,b\)的\(gcd\),但是这样一定不是最优的,\(a,b\)的\(gcd\)一定会被枚举到并且成为最优解,所以答案一定会被更新成最优的。

#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
const int N=1000001;
const int inf=2e9;
int n,Mx,w[N],ans[N];
int tot,c[N],f[N],g[N],cnt[N],Mark[N],prm[N>>2];
int gi(){
R x=0,k=1;char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=getchar();
if(c=='-')k=-1,c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*k;
}
void init(){
for(R i=2;i<=Mx;++i){
if(!Mark[i])prm[++tot]=i,c[i]=1;
for(R j=1;j<=tot&&prm[j]*i<=Mx;++j){
Mark[i*prm[j]]=1,c[i*prm[j]]=c[i]+1;
if(i%prm[j]==0)break;
}
}
}
int main(){
freopen("9.in","r",stdin);
freopen("s.out","w",stdout);
n=gi();
for(R i=1;i<=n;++i)w[i]=gi(),Mx=max(Mx,w[i]);
init(),c[0]=2e9;
for(R i=1;i<=n;++i){
for(R j=1;j*j<=w[i];++j){
if(w[i]%j)continue;
R k=w[i]/j;
if(c[w[i]]<c[w[f[j]]])g[j]=f[j],f[j]=i;
else if(c[w[i]]<c[w[g[j]]])g[j]=i;
if(j==k)continue;
if(c[w[i]]<c[w[f[k]]])g[k]=f[k],f[k]=i;
else if(c[w[i]]<c[w[g[k]]])g[k]=i;
}
}
for(R i=1;i<=n;++i){
R ans=0,Mn=2e9;
for(R j=1;j*j<=w[i];++j){
if(w[i]%j)continue;
R k=w[i]/j,x=0;
if(f[j]==i)x=g[j];
else x=f[j];
if(Mn>c[w[i]]+c[w[x]]-2*c[j]||(Mn==c[w[i]]+c[w[x]]-2*c[j]&&ans>x))
Mn=c[w[i]]+c[w[x]]-2*c[j],ans=x;
if(j==k)continue;
if(f[k]==i)x=g[k];
else x=f[k];
if(Mn>c[w[i]]+c[w[x]]-2*c[k]||(Mn==c[w[i]]+c[w[x]]-2*c[k]&&ans>x))
Mn=c[w[i]]+c[w[x]]-2*c[k],ans=x;
}
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. Java核心:类加载和JVM内存的分配
  2. 最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow
  3. Sql Server总结
  4. Python[小甲鱼005Python的数据类型]
  5. 【Python】 解析Python中的运算符
  6. android toolbar效果3
  7. QT 14 线程使用
  8. Python基础(协程函数、内置函数、递归、模块和包)-day05
  9. android camera(一):camera模组CMM介绍【转】
  10. #151: 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-x
  11. JAVA动态编译辅助类
  12. 为什么WAN口IP和外网IP不一样(不一致)?
  13. WhatsApp &amp; Tasker for Android – Read &amp; Write messages
  14. jQuery之ajaxForm提交表单
  15. python 简明教程
  16. linux的定制和发布(二)
  17. luoguP3830 [SHOI2012]随机树 期望概率 + 动态规划 + 结论
  18. 想控制GIF图片动画播放吗?试试gifffer.js
  19. 【优先队列】POJ1442-Black Box
  20. Sort函数(C++)

热门文章

  1. heap和stack区别
  2. P1364 医院设置 (补锅,memset初始化较大值不可用0x7fffffff )
  3. RCU原理分析
  4. Django信号量
  5. 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢
  6. css让字体细长
  7. JVM监控工具之jmap、jstat、stack、jps、jstatd、jinfo、jhat、jdb
  8. 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO
  9. Apache web服务器(LAMP架构)
  10. pyinstaller如何将自己写的模块一并打包到exe中