B.Basic Gcd Problem(质因数分解)
思路:考虑 的贡献次数,我们最后的答案肯定是: 形式,所以我们只需求出 。
。
显然 。
。
。
所以 。
看了上面这个样例你可能已经发现了 跟因数有关系。
因为我们要让 尽可能大,所以我们需要尽可能多的进行相乘转换。
我们换个方式考虑: 。
。
这样是不是很显然了。
再来: 。
。
显然按照质因数分解后的个数依次相乘 是最大的。
即答案就是质因数个数之和。
接下来就很简单了,可以考虑直接暴力 一边分解一边计算贡献,或者预处理一波每个数的对应素数。
总复杂度: 或
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,c;
scanf("%d%d",&n,&c);
ll ans=1;
for(int i=2;i*i<=n;i++){
while(n%i==0){
n/=i;
ans=ans*c%mod;
}
}
if(n!=1) ans=ans*c%mod;
printf("%lld\n",ans);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
bool a[N];
int b[N],p[N];
void Ess(){
int cnt=0;
int n=1e6;
a[1]=true;
for(int i=2;i<=n;i++)
{
if(!a[i]) p[cnt++]=i,b[i]=i;
for(int j=0;j<cnt&&i*p[j]<=n;j++)
{
a[i*p[j]]=true,b[i*p[j]]=p[j];
if(i%p[j]==0) break;
}
}
}
ll ksm(ll a,ll n){
ll ans=1;
while(n){
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
int main(){
int t;
Ess();
scanf("%d",&t);
while(t--){
ll n,c;
scanf("%lld%lld",&n,&c);
if(!a[n]) printf("%lld\n",c%mod);
else {
int cnt=0;
while(n!=1){
n/=b[n];
cnt++;
}
printf("%lld\n",ksm(c,cnt));
}
}
return 0;
}