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;
}
posted @ 2018-11-02 11:19  lnyzo  阅读(98)  评论(0编辑  收藏  举报