CF603B Moodular Arithmetic(数论+快速幂)

首先k=0时,答案就是 pp1

k=1时,答案就是 pp

k>=2时答案就是 pp1m ,其中m为k mod p意义下的order。

根据费马小定理,我们有 kp11mod p ,所以m一定是p-1的因数,也可以 O(p) 的枚举p-1的因数来算。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000010
#define mod 1000000007
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int p,k;
inline int ksm(int x,int k){
    int res=1;
    for(;k;k>>=1,x=(ll)x*x%mod)
        if(k&1) res=(ll)res*x%mod;return res;
}
int main(){
//  freopen("a.in","r",stdin);
    p=read();k=read();
    if(!k){printf("%d\n",ksm(p,p-1));return 0;}
    if(k==1){printf("%d\n",ksm(p,p));return 0;}
    int m=1,x=k;
    while(x!=1){
        ++m,x=(ll)x*k%p;
    }printf("%d\n",ksm(p,(p-1)/m));return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值