素因子去重题目
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=23 * 53,p=2 * 5=10
思路一:通过筛选法将2~1012中的素数求出,再通过枚举素数的方式判断素数是否为n的因数,将是n的素因数(不重复)累乘,即可得到答案。该思路的复杂度为O(n)。这个思路没错,但是数据规模和约定中写明n<=1012,假设n==1012时,程序会出现运行时间过长的情况。
通过观察题目,我们了解到p为n的素因数乘积,且每个素因子的次数不大于1。
考虑最糟糕的情况,假设1012>=n>=1011,同时n又恰好等于为106规模上的素数与105规模上的素数(不重复)的乘积,那么我们只要判断0~106内的素数的情况就能够判断出p,得出思路二。
思路二:筛选法将2~106中的素数求出,再通过枚举素数的方式判断素数是否为n的因数,将是n的素因数累乘,即可得到答案。该思路的复杂度为O(n1/2)。满足题目运行时间条件。
#include<bits/stdc++.h>
#define ll long long
using namespace std