题目
题目背景
质数(又称“素数”)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。
问题描述
小 P 同学在学习了素数的概念后得知,任意的正整数 n 都可以唯一地表示为若干素因子相乘的形式。如果正整数 n 有 m 个不同的素数因子 p1,p2,⋯,pm,则可以表示为:n=p1t1×p2t2×…×pmtm。
小 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<iostream>
#include<map>//哈希表存储因子
#include<math.h>
using namespace std;
int main()
{
//func(max_num);
int q,k;
long long n;
cin>>q;
while(q > 0)
{
long long ans=1;
cin>>n>>k;
map<long long,int>a;
for(long long i =2;i*i<=n;i++)
{
while(n%i==0)
{
a[i]++;
n/=i;
}
}
for(auto s:a)
{
if(s.second>=k)
ans*=pow(s.first,s.second);
}
cout<<ans<<endl;
q--;
}
return 0;
}
优化
- 划定边界时候可以用i<n/i
- pow可用快速幂代替快速幂
//非递归快速幂
int qpow(int a, int n){
int ans = 1;
while(n){
if(n&1) //如果n的当前末位为1
ans *= a; //ans乘上当前的a
a *= a; //a自乘
n >>= 1; //n往右移一位
}
return ans;
}