又来做愉快的板子OI
题面很复杂啊,但是读完题就会发现我们只需要求几个线性同余方程的解和质因数分解一个最大为 2 62 2^{62} 262的数(保证此数等于两个不等质数p,q之积)
如果你不会线性同余方程请出门右转NOIP专区
如果你不会分解那个巨大的数(不好意思我做这题之前也不会 )请去了解一下pollard rho算法
zxyoi的讲解link:https://blog.csdn.net/zxyoi_dreamer/article/details/86761985
Code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
inline ll mul(ll a,ll b,ll mod){return (a*b-(ll)((long double)a/mod*b)*mod+mod)%mod;}
inline ll ksm(ll a,ll b,ll mod){ll res=1;for(;b;b>>=1) {if(b&1) res=mul(res,a,mod);a=mul(a,a,mod);}return res;}
inline ll labs(ll x){return x>0?x:-x;}
ll lgcd(ll a,ll b){return b==0?a:lgcd(b,a%b);}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(!b) {d=a,x=1,y=0;}
else{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-(a/b)*x;
}
}
int main(){
srand(10007);
ll e,N,c,x,y,r,p,q,pri,i,k,D,d,f=1;
cin>>e>>N>>c;
while(f){
i=1;k=2;x=rand()%(N-1)+1;y=x;
while(1){
++i;
x=(mul(x,x,N)+pri)%N;
if(x==y) break;
d=lgcd(labs(x-y),N);
if(1<d && d<N) {p=d;q=N/d;f=0;break;}
if(i==k) {y=x;k*=2;}
}
pri--;
}
r=(p-1)*(q-1);
exgcd(e,r,D,x,y);
d=(x%r+r)%r;
cout<<d<<" "<<ksm(c,d,N);
return 0;
}