目录
一、题目
链接:
题目背景
质数(又称“素数”)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。
问题描述
小 P 同学在学习了素数的概念后得知,任意的正整数 n 都可以唯一地表示为若干素因子相乘的形式。如果正整数 n 有 m 个不同的素数因子 p1,p2,⋯,pm,则可以表示为:n=p1^t1×p2^t2×...×pm^tm。
小 P 认为,每个素因子对应的指数 ti 反映了该素因子对于 n 的重要程度。现设定一个阈值 k,如果某个素因子 pi 对应的指数 ti 小于 k,则认为该素因子不重要,可以将 pi^ti 项从 n 中除去;反之则将 pi^ti 项保留。最终剩余项的乘积就是 n 简化后的值,如果没有剩余项则认为简化后的值等于 1。
试编写程序处理 q 个查询:
每个查询包含两个正整数 n 和 k,要求计算按上述方法将 n 简化后的值。
输入格式
从标准输入读入数据。
输入共 q+1 行。
输入第一行包含一个正整数 q,表示查询的个数。
接下来 q 行每行包含两个正整数 n 和 k,表示一个查询。
输出格式
输出到标准输出。
输出共 q 行。
每行输出一个正整数,表示对应查询的结果。
样例输入
3
2155895064 3
2 2
10000000000 10
样例输出
2238728
1
10000000000
二、题解
#include<bits/stdc++.h>
using namespace std;
//判断素数
int isPrime(int x) {
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
void query(long long n, int k) {
long long temp = n;
long long final = 1;
for(int i=2; i * i <= n; i++) {
if(isPrime(i)){
int num = 0;
while(n%i==0){
n/=i;
num++;
}
// printf("%d\n", num);
if(num>=k){
while(num--){
final*=i;
}
}
}
}
if(final==temp){
printf("%lld\n", temp);
}else if(final==1){
printf("1\n");
}else{
printf("%lld\n", final);
}
}
int main() {
int q;
scanf("%d", &q);
for(int i=0; i<q; i++) {
long long n;
int k;
scanf("%lld%d", &n, &k);
query(n, k);
}
return 0;
}