添加链接描述
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+9;
vector<ll> v[N];
void init(int n){
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
v[j].push_back(i);
}
}
}
ll quick(ll a,ll b,ll mod){
ll res=1;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll num[N],cnt[N];
int main(){
init(1e5);
ll n,x,k,p;
cin>>n;
while(n--){
ll ans=0;
cin>>x>>k>>p;
for(int i=0;i<v[x].size();i++){
num[v[x][i]]++;//得到集合的约数
}
for(int i=v[x].size()-1;i>=0;i--){
int y=v[x][i];//y为约数
cnt[y]+=num[y];//得到约数的个数
if(cnt[y]>0){
ans=(ans+cnt[y]*quick(y,k,p))%p;
for(int j=0;j<v[y].size();j++){
cnt[v[y][j]]-=cnt[y];//从小到大y的约数都减去当前约数的数量
}
cnt[y]=0;//清零
}
}
cout<<ans<<endl;
}
return 0;
}