Wannafly挑战赛27 D绿魔法师
#include<bits/stdc++.h>
#define R register int
#define ll long long
#define il inline
using namespace std;
const int N=100002;
int n,lim,x,k,mod,tp,S[N],hav[N],STK[N];
vector<int>G[N];
il int gi(){
ll x=0,k=1;char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=getchar();
if(c=='-')k=-1,c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*k;
}
il int Qpow(R x,R y){
R ans=1,bas=x;
while(y){
if(y&1)ans=1ll*ans*bas%mod;
bas=1ll*bas*bas%mod,y>>=1;
}return ans;
}
il void sol(){
R res=0;
x=gi(),k=gi(),mod=gi();
for(R i=0,lim=G[x].size();i<lim;++i)
S[G[x][i]]++;
for(R i=G[x].size()-1,v=G[x][i];i>=0;--i,v=G[x][i]){
if(!S[v])continue;
res=(res+1ll*S[v]*Qpow(v,k)%mod)%mod;
for(R j=G[v].size()-2;j>=0;--j){
S[G[v][j]]-=S[v];
if(!hav[G[v][j]])STK[++tp]=G[v][j];
hav[G[v][j]]+=S[v];
}
}
while(tp)S[STK[tp]]+=hav[STK[tp]],hav[STK[tp]]=0,tp--;
printf("%d\n",res);
}
int main(){
n=gi(),lim=1e5+1;
for(R i=1;i<=lim;++i)
for(R j=i;j<=lim;j+=i)
G[j].push_back(i);
while(n--)sol();
return 0;
}
优质内容筛选与推荐>>