当前位置: 代码迷 >> 综合 >> 小技巧-O(W)+O(nlogn)分解质因数
  详细解决方案

小技巧-O(W)+O(nlogn)分解质因数

热度:98   发布时间:2023-12-14 10:08:53.0

好神奇啊。。。

思路 :先用线性筛筛出值域内所有数的最大的质因数,每次查询时直接暴力除以质因数,因为每次至少减少12\frac{1}{2}21?,所以单次查询复杂度是O(logW)O(log_W)O(logW?),理论上常数挺小的。

代码段(n=106n=10^6n=106,W=107W=10^7W=107):

	n=read();for(int i=2;i<=10000000;++i){
    if(!vis[i]){
    p[++cnt]=i;Maxp[i]=i;}for(int j=1;p[j]*i<=10000000;++j){
    vis[p[j]*i]=1;//线性筛Maxp[p[j]*i]=max(p[j],Maxp[i]);//求最大的质因子if(i%p[j]==0)break;}}for(int i=1;i<=n;++i){
    a[i]=read();int tmp=a[i];while(tmp!=1){
    int t=Maxp[tmp];while(tmp%t==0)tmp/=t,printf("%d ",t);}puts("");}
  相关解决方案