问题详情:
输入输出样例及解释:
代码思路喵:
-
读取输入:
- 首先读取查询的个数
q
,表示有多少次查询需要处理。
- 首先读取查询的个数
-
处理每一个查询:
- 对于每个查询,读取两个数字
n
和k
:n
是要进行质因数分解的数。k
是阈值,用来决定是否保留某个质因子。
- 对于每个查询,读取两个数字
-
质因数分解:
- 对于给定的
n
,我们要找到所有的质因子,并计算每个质因子的指数(该质因子在n
的分解中出现的次数)。 - 遍历从
2
到sqrt(n)
的每个数i
,检查i
是否为n
的因子:- 如果
i
是n
的因子,不断地将n
除以i
,同时记录i
的指数(coef
)。 - 如果
coef
(指数)大于或等于阈值k
,那么就保留这个质因子,将i^coef
乘入结果res
。
- 如果
- 对于给定的
-
处理剩余的质因子:
- 在遍历完所有可能的因子后,如果
n
仍然大于1
,说明n
本身是一个质数(剩余的n
不可能被2
到sqrt(n)
的任何数整除)。 - 如果
k
是1
(即任何质因子出现一次就保留),那么将这个质数n
乘入结果res
。
- 在遍历完所有可能的因子后,如果
-
输出结果:
- 对每个查询,计算出
n
简化后的值res
,并输出。 - 如果所有质因子的指数都小于
k
,则res
保持为1
- 对每个查询,计算出
详细代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int main(){
int q;
cin>>q;
while(q--){
LL n,res=1;
int k;
cin>>n>>k;
for(int i=2;i<=n/i;i++){
int co=0;
while(n%i==0){
n/=i;
co++;//素因子出现的次数
}
if(co>=k){
while(co--){
res*=i;
}
}
}
if(n>1){
if(k==1){
res*=n;
}
}
cout<<res<<endl;
}
return 0;
}