1. 程式人生 > >51nod 1434 區間LCM (質因數分解)

51nod 1434 區間LCM (質因數分解)

分享 col tin mes == space txt ima cstring

技術分享

分析:考慮從1到n所有數的質因數分解,記錄每個質數的最高次數,同理從n+1循環到2n,如果循環到m時每個質因子的次數都不低於所記錄的,則跳出循環,結果即為m。先預處理質數,復雜度為O(nlongn)。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1000005;
 7 int prinum[maxn],len=0,n,m,power[maxn],order[maxn];
8 int num[maxn]; 9 void CalPri(){ 10 memset(order,-1,sizeof(order)); 11 for(int i=0;i<maxn;i++)num[i]=i; 12 for(int i=2;i<maxn;i++){ 13 if(num[i]==0)continue; 14 prinum[len++]=i; 15 order[i]=len-1; 16 for(int j=2*i;j<maxn;j+=i){ 17 num[j]=0
; 18 } 19 } 20 } 21 int solve(){ 22 int countp=0; 23 if(order[n]!=-1)return 2*n; 24 memset(power,0,sizeof(power)); 25 for(int k=0;k<len&&prinum[k]<=n;k++){ 26 long long p=prinum[k],p0=prinum[k]; 27 countp++; 28 while(p<=n){ 29 p*=p0;
30 power[k]++; 31 } 32 // int k0=k; 33 // for(int i=0;i<len&&prinum[i]*prinum[i]<=k0;i++){ 34 // if(k0%prinum[i])continue; 35 // int p=prinum[i],cnt=0; 36 // if(power[i]==0)countp++; 37 // while(k0%p==0){ 38 // k0/=p;cnt++; 39 // } 40 // power[i]=max(cnt,power[i]); 41 // } 42 // if(k0!=1){ 43 // if(power[order[k0]]==0)countp++; 44 // power[order[k0]]=max(1,power[order[k0]]); 45 // } 46 } 47 for(int k=n+1;k<=2*n;k++){ 48 int k0=k; 49 for(int i=0;i<len&&prinum[i]*prinum[i]<=k0;i++){ 50 if(k0%prinum[i])continue; 51 int p=prinum[i],cnt=0; 52 while(k0%p==0){ 53 k0/=p;cnt++; 54 } 55 if(power[i]>0&&power[i]<=cnt){ 56 countp--; 57 power[i]=0; 58 } 59 } 60 if(k0!=1&&power[order[k0]]==1){ 61 countp--;power[order[k0]]=0; 62 } 63 if(!countp){ 64 return k; 65 } 66 } 67 } 68 int main(){ 69 //freopen("e:\\in.txt","w",stdout); 70 CalPri(); 71 int t; 72 cin>>t; 73 while(t--){ 74 cin>>n; 75 cout<<solve()<<endl; 76 } 77 return 0; 78 }

51nod 1434 區間LCM (質因數分解)