題目鏈接:https://ac.nowcoder.com/acm/contest/3007/E
題目大意:
我們要求最大的A。
我們根據唯一分解定理:
那麼
現在我們就是要
我們發現
我們枚舉
我們可以進一步優化:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
#define MAXN 1000005
#define MAXL 5299710
LL prime[MAXN];
LL Lf[MAXN];//存儲立方
LL check[MAXL];
LL tot = 0;
void get_prime(LL n){
memset(check, 0, sizeof(check));
for(LL i = 2; i <= n; ++i){
if (!check[i])
prime[tot++] = i, Lf[tot-1]=i*i*i;
for (LL j = 0; j < tot; ++j){
if (i * prime[j] > n)
break;
check[i*prime[j]] = 1;
if (i % prime[j] == 0)
break;
}
}
}
int main(){
get_prime(31622);
int t;scanf("%d", &t);
while(t--){
LL n, A=1;scanf("%lld", &n);
for(int i=0; i<tot&&prime[i]<=n; i++){
while(n%Lf[i]==0){//立方篩完
A*=prime[i];
n/=Lf[i];
}
while(n%prime[i]==0){
n/=prime[i];
}
}
int lb = 1, rb = 1000000;//二分判斷X是不是立方數
while(lb <= rb){
int md = lb + rb >> 1;
if((LL)md * md * md < n)
lb = md + 1;
else
rb = md - 1;
}
if((LL)lb * lb * lb == n)
A *= lb;
printf("%lld\n", A);
}
return 0;
}