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;
}

转载于:https://www.cnblogs.com/MikuKnight/p/9895216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值