前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >南京网络预选赛 The Preliminary Contest for ICPC Asia Nanjing 2019 B. super_log 欧拉降幂

南京网络预选赛 The Preliminary Contest for ICPC Asia Nanjing 2019 B. super_log 欧拉降幂

作者头像
用户2965768
发布2019-09-06 11:49:08
3580
发布2019-09-06 11:49:08
举报
文章被收录于专栏:wymwym

模拟欧拉降幂

代码语言:javascript
复制
#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <utility>
#include <cstdlib>
#include <cassert>
#include <ctime>
//#include <unordered_map>
#include <bitset> 
#include <stack>
#include <sstream>
#include <algorithm>
#include <functional>
#include <numeric>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <list>
#include <set>
#include <iomanip>
#include <cctype>
#define sf scanf
#define gr getchar()
#define pf printf
#define sz(type) (type).size()
#define pb push_back
#define mp make_pair
#define IT iterator
using namespace std;
typedef long long ll;
inline ll qpow(ll,ll,ll);
const int N = 1e6+5;
int prime[N],tot;
ll phi[N],maxn = 1e6;

void pre(int n){
	tot = 0;
	phi[1] = 1;
	memset(phi,0,sizeof(phi));
	for(int i=2;i<=n;i++){
		if(!phi[i]){
			prime[tot++]=i;
			phi[i]=1ll*(i-1);
		}
		for(int j=0;j<tot&&i*prime[j]<=n;j++){
			if(i%prime[j]!=0) phi[i*prime[j]]=phi[i]*phi[prime[j]];
			else{
				phi[i*prime[j]]=1ll*prime[j]*phi[i];
				break;
			}
		}
	}
}
inline ll euler(ll n){
	if(n <= 1ll*maxn) return phi[n];
	ll ans = n;
	for(int i=0;i<tot&&prime[i]*prime[i]<=n;i++){
		if(n%prime[i]==0){
			ans -= ans/prime[i];
			while(n%prime[i]==0) n/=prime[i];
		}
	}
	if(n > 1) ans -= ans/n;
	return ans;
}
inline ll check(ll x,ll n,ll mod){
	ll ans = 1;
	for(ll i=1;i<=n;i++){
		ans*=x;
		if(ans >= mod) return ans;
	}
	return ans;
}

inline ll solve(ll a,int n,ll p){
	if(n==0) return 1;
	if(p==1) return 1;
	ll exp = solve(a,n-1,euler(p)),ans;
	ans = check(a,exp,p);
	if(ans >= p) ans = qpow(a,exp,p) + p;
	return ans;
} 
int main(){
	int t,b;
	ll a,p;
	pre(maxn);
	sf("%d",&t);
	while(t--){
		sf("%lld%d%lld",&a,&b,&p);
		pf("%lld\n",solve(a,b,p)%p);
	}
    return 0;
}

inline ll qpow(ll x,ll n,ll mod) {
    ll ans = 1,a = x;
    while(n) {
        if(n&1) {
            ans = ans*a%mod;
        }
        a = a*a%mod;
        n>>=1;
    }
    return ans;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档