0
点赞
收藏
分享

微信扫一扫

绿魔法师 (约数 容斥

刘员外__ 2022-01-11 阅读 122

添加链接描述
在这里插入图片描述

#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;
}
举报

相关推荐

0 条评论