Wannafly挑战赛D绿魔法师
迭代器相关
定义rbegin和rend要用逆向迭代器reverse_iterator
不过auto只有c++11才能用TWT
一个还挺好用的c++11编辑器
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
inline void read(int &x){
char c=getchar();x=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
}
typedef long long ll;
int n,num[N],top;
std::vector<int>a[N];
std::pair<int,int>sta[N];
inline ll ksm(ll x,ll y,ll mo){
ll res=1;
for(;y;y>>=1,x=x*x%mo)if(y&1)res=res*x%mo;
return res;
}
int main(){
read(n);
for(int i=1;i<=1e5;i++)
for(int t=100000/i,j=1;j<=t;j++)
a[i*j].push_back(i);
for(int x,k,p,i=1;i<=n;i++){
read(x),read(k),read(p);
ll ans=0;
for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)++num[*it];
for(vector<int>::reverse_iterator it=a[x].rbegin();it!=a[x].rend();++it){
if(!num[*it])continue;
ans=(ans+num[*it]*ksm(*it,k,p))%p;
for(vector<int>::iterator pt=a[*it].begin();pt!=a[*it].end();++pt){
sta[++top]=make_pair(*pt,num[*it]),num[*pt]-=num[*it];
}
}
while(top){num[sta[top].first]+=sta[top].second;--top;}
printf("%lld\n",ans);
}
return 0;
}
c++11
#include<cstdio>
#include<cctype>
#include<vector>
const int N=1e5+5;
inline void read(int &x){
char c=getchar();x=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
}
typedef long long ll;
int n,num[N],top;
std::vector<int>a[N];
std::pair<int,int>sta[N];
inline ll ksm(ll x,ll y,ll mo){
ll res=1;
for(;y;y>>=1,x=x*x%mo)if(y&1)res=res*x%mo;
return res;
}
int main(){
read(n);
for(int i=1;i<=1e5;i++)
for(int t=100000/i,j=1;j<=t;j++)
a[i*j].push_back(i);
for(int x,k,p,i=1;i<=n;i++){
read(x),read(k),read(p);
ll ans=0;
for(auto it=a[x].begin();it!=a[x].end();++it)++num[*it];
for(auto it=a[x].rbegin();it!=a[x].rend();++it){
if(!num[*it])continue;
ans=(ans+num[*it]*ksm(*it,k,p))%p;
for(auto pt=a[*it].begin();pt!=a[*it].end();++pt){
sta[++top]=std::make_pair(*pt,num[*it]),num[*pt]-=num[*it];
}
}
while(top){num[sta[top].first]+=sta[top].second;--top;}
printf("%lld\n",ans);
}
return 0;
}