题意:给定大整数n,求其质因数分解的最小质数幂
n<=1e18
思路:常规分解算法肯定不行
考虑答案大于1的情况只有3种:质数的完全平方,质数的完全立方,以及p^2*q^3,p,q>=1三种形式
前两种可以暴力判
第三种必定有一个小于10^(18/5)的因子,大概是3800
迭代分解,用vector存一下具体的情况
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 //typedef pair<ll,ll>P; 11 #define N 1000010 12 #define M 200010 13 #define fi first 14 #define se second 15 #define MP make_pair 16 #define pb push_back 17 #define pi acos(-1) 18 #define mem(a,b) memset(a,b,sizeof(a)) 19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 21 #define lowbit(x) x&(-x) 22 #define Rand (rand()*(1<<16)+rand()) 23 #define id(x) ((x)<=B?(x):m-n/(x)+1) 24 #define ls p<<1 25 #define rs p<<1|1 26 27 const int MOD=1e9+7,inv2=(MOD+1)/2; 28 double eps=1e-4; 29 int INF=1e9; 30 int inf=0x7fffffff; 31 int dx[4]={-1,1,0,0}; 32 int dy[4]={0,0,-1,1}; 33 34 ll p[100000],mn[100000]; 35 36 int read() 37 { 38 int v=0,f=1; 39 char c=getchar(); 40 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 41 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 42 return v*f; 43 } 44 45 ll check2(ll n) 46 { 47 ll t=sqrt(n); 48 if(t*t==n) return t; 49 return 0; 50 } 51 52 ll check3(ll n) 53 { 54 ll t=pow(n,1.0/3)+0.5; 55 if(t*t*t==n) return t; 56 return 0; 57 } 58 59 VII solve(ll n) 60 { 61 if(n<100000000) 62 { 63 VII re; 64 for(int i=1;i<=p[0]&&p[i]*p[i]<=n;i++) 65 if(n%p[i]==0) 66 { 67 int s=0; 68 while(n%p[i]==0) 69 { 70 s++; 71 n/=p[i]; 72 } 73 re.push_back(MP(p[i],s)); 74 } 75 if(n>1) re.push_back(MP(n,1)); 76 return re; 77 } 78 int t; 79 if(t=check2(n)) 80 { 81 VII re=solve(t); 82 for(int i=0;i<re.size();i++) re[i].se*=2; 83 return re; 84 } 85 if(t=check3(n)) 86 { 87 VII re=solve(t); 88 for(int i=0;i<re.size();i++) re[i].se*=3; 89 return re; 90 } 91 ll t1=0,t2=0; 92 for(int i=1;i<=p[0]&&p[i]*p[i]*p[i]*p[i]*p[i]<=n;i++) 93 if(n%p[i]==0) 94 { 95 t1=p[i]; 96 while(n%p[i]==0) 97 { 98 t2++; 99 n/=p[i]; 100 } 101 break; 102 } 103 if(t1==0) return VII(1,MP(0,1)); 104 VII re=solve(n); 105 re.push_back(MP(t1,t2)); 106 return re; 107 } 108 109 110 int main() 111 { 112 //freopen("1.in","r",stdin); 113 //freopen("1.out","w",stdout); 114 rep(i,2,10000) 115 { 116 if(!mn[i]) 117 { 118 p[++p[0]]=i; 119 mn[i]=p[0]; 120 } 121 for(int j=1;j<=mn[i]&&i*p[j]<=10000;j++) mn[i*p[j]]=j; 122 } 123 int cas=read(); 124 while(cas--) 125 { 126 ll n; 127 scanf("%I64d",&n); 128 VII t=solve(n); 129 if(t.empty()) printf("1 "); 130 else 131 { 132 int ans=100000; 133 for(int i=0;i<t.size();i++) ans=min(ans,t[i].se); 134 printf("%d ",ans); 135 } 136 } 137 138 return 0; 139 }