
分析
1.超时的主要原因在于main中的for循环内部,将乘法从循环中拿出来,使得指数和底数分离保存。
2.提前计算100000以内的素数。
代码1 运行超时,90分
#include<iostream>
#include<cmath>
using namespace std;
bool su(int k)
{
if(k==2)
{
return true;
}
else if(k%2==0)
return false;
else
{
for(int i=2;i<=sqrt(k);i++)
{
if(k%i==0)
{
return false;
}
}
return true;
}
}
int main()
{
int q;
cin>>q;
long long arr[10][2]={0};
for(int i=0;i<q;i++)
{
cin>>arr[i][0]>>arr[i][1];
}
for(int i=0;i<q;i++)
{
long long ans=1;
for(int j=2;j<10000000000;j++)
{
long long tem=1;
int x=0;
if(su(j))
{
while(arr[i][0]%j==0)
{
tem*=j;
x++;
arr[i][0]/=j;
}
if(x>=arr[i][1])
{
ans*=tem;
}
if(arr[i][0]==1)
{
cout<<ans<<endl;
break;
}
}
}
}
return 0;
}
代码2
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
bool su(int k)
{
if(k==2)
{
return true;
}
else
{
for(int i=2;i<=sqrt(k);i++)
{
if(k%i==0)
{
return false;
}
}
return true;
}
}
int main()
{
int q;
cin>>q;
long long arr[10][2]={0};
vector<int>s;
vector<int>n;
for(int i=2;i<100000;i++)
{
if(su(i))
{
s.push_back(i);
}
}
long long ans=1;
for(int i=0;i<q;i++)
{
n.clear();
int result[100000]={0};
cin>>arr[i][0]>>arr[i][1];
ans=1;
for(int j=0;j<s.size();j++)
{
while(arr[i][0]%s[j]==0)
{
n.push_back(s[j]);
arr[i][0]/=s[j];
}
}
for(int j=0;j<n.size();j++)
{
result[n[j]]++;
}
for(int j=0;j<100000;j++)
{
if(result[j]>=arr[i][1])
{
for(int c=0;c<result[j];c++)
{
ans*=j;
}
}
}
cout<<ans<<endl;
}
return 0;
}