思路
- ①:等式变为
C
D
3
\sqrt[]{CD^3}
CD3
=
D
×
C
D
D \times \sqrt[]{CD}
D×CD
,先把C的所有质因数求出来,那么其中质因数质数为奇数的肯定是D的一个因数,只要求出所有C的满足以上条件的质因数,将其相乘就是D的最小值了
- ②:这里的C的范围太大了,所以这里就只枚举一下
1
0
5
10^{5}
105的范围,来预处理一下所有素数,由于如果C再除去了所有小于等于
1
0
5
10^{5}
105的素数以后,如果大于0,那么此时的C一定是由大于
1
0
5
10^{5}
105的素数组成,而这样的素数不会超过2个,因为3个
1
0
5
10^{5}
105以上的素数乘起来大于
2
63
2^{63}
263,所以此时只要判断一下最后C是否能被开方,如果不能就一起算满足①中条件的质因数。
代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll pri[3000005],vis[3000005];
int tot;
void get_prime(){
tot = 0;
for (int i=2;i<=3000000;i++) {
if (!vis[i]) pri[tot++]=i;
for (int j=0;j<tot&&i*pri[j]<=3000000;j++) {
vis[i*pri[j]]=1;
if (i%pri[j]==0) break;
}
}
}
int main(){
get_prime();
ll res=1,c;
cin>>c;
for(int i=0;i<tot;i++){
ll x=pri[i];
if(c%x==0){
int cnt=0;
while(c%x==0){
cnt++;
c/=x;
}
if(cnt%2==1) res*=x;
}
}
ll d=sqrt(c);
if(d*d!=c&&d!=0){
res*=c;
}
cout<<res<<endl;
return 0;
}