hdu 6623 Minimal Power of Prime 素数筛、因式分解

题目给的n为1e18,无法预处理出1e18的素数,但是当大于1e4的因子,最多只有4个,所以可以先预处理出1e4以内的素数,然后对 n 分解质因数,若n == 1,那么取幂数最小的质因数,否则继续判断,

n = p^{4}  ...p^{3} ... p^2...p 

#include
using namespace std;
typedef long long ll;
const int N = 1e4+100;
int t;
ll n;
int pri[N], cnt = 0;
int vis[N];
void init(){
	for(int i = 2; i < N; i++){
		if(!vis[i]){
			pri[cnt++] = i;
		}
		for(int j = i*i; j < N; j += i){
			vis[j] = 1;
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin >> t;
	init();
	while(t--){
		cin >> n;
		int res = 1e9;
		for(int i = 0; i < cnt; i++){
			if(n < pri[i]) break;
			if(n%pri[i] == 0){
				int ans = 0;
				while(n%pri[i] == 0){
					n /= pri[i];
					ans ++;
				}
				res = min(res, ans);
			}
		}
		if(n == 1){
			cout << res << "\n";
			continue;
		}
		int ans = 0;
		for(int i = 4; i >= 1; i--){
			ll l=1e4, r=(ll)pow(1e18,1.0/i)+1, mid;
			while(l<=r){
				mid = (l+r) / 2;
				if(pow(mid, i) <= n) l = mid + 1;
				else r = mid - 1;
			}
			if(pow(r, i) == n){
				res = i;
				break;
			}
		}
		cout << res << "\n";
	}
	return 0;
}

 

你可能感兴趣的:(数论)