URAL 1456 求a模n的阶

简介:

首要条件是a,n互素,也就是求a^x=1(n)最小的x,根据欧拉函数可知最大为n的欧拉函数值。所以n的欧拉函数值的因子就可以了。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
ll phi(long long n)
{
    long long rea=n;
    for(int i=2; i*i<=n; i++)
        if(n%i==0)
        {
            rea=rea-rea/i;
            do
                n/=i;
            while(n%i==0);
        }
    if(n>1)rea=rea-rea/n;
    return rea;
}
ll exp_mod(ll a,ll b,ll c)
{
    a%=c;
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%c;
        b>>=1,a=a*a%c;
    }
    return ans;
}
int main()
{
    ll a,n;
    cin>>a>>n;
    if(gcd(a,n)!=1)
    {
        puts("0");
        return 0;
    }
    ll p=phi(n),l=(ll)sqrt(p*1.0),ans=1e9;
    for(ll i=1; i<=l; i++)
        if(p%i==0)
        {
            if(exp_mod(a,i,n)==1)ans=min(ans,i);
            if(exp_mod(a,p/i,n)==1)ans=min(ans,p/i);
        }
    printf("%I64d\n",ans);
    return 0;
}


目录
相关文章
|
2月前
PTA-求平方与倒数序列的部分和
求平方与倒数序列的部分和
19 1
|
3月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
49 0
【PTA】​ L1-080 乘法口诀数列​(C++)
|
11月前
PTA 7-10 大数的乘法(10 分)
PTA 7-10 大数的乘法(10 分)
n阶幻方类的实现(C++)
有这样的一个魔方,1放在第一行的中间位置,随后输入1~n²
217 0
n阶幻方类的实现(C++)
|
算法 C语言 UED
[解题报告]《算法零基础100讲》(第1讲) 幂和对数
[解题报告]《算法零基础100讲》(第1讲) 幂和对数
[解题报告]《算法零基础100讲》(第1讲) 幂和对数
|
机器学习/深度学习
【PTA】7-10 方阵转置 (15分)
【PTA】7-10 方阵转置 (15分)
458 0
|
人工智能 Python
codeforces1151B Dima(异或的性质)
codeforces1151B题解(异或的性质)
1328 0
|
算法 大数据
51Nod 1080 两个数的平方和(数论,经典题)
1080 两个数的平方和                 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题                 给出一个整数N,将N表示为2个整数i j的平方和(i
885 0