设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
Input
输入1个质数P(3 <= P <= 10^9)
Output
输出P最小的原根。
Input示例
3
Output示例
2
我一定会被数论折磨死的,完全的知识空白,什么是原根?
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1
#include
#include
#define _MAX 10000005
int P, tot;
int A[_MAX];
void store()
{
int tmp, now;
tmp = (int)((double)sqrt(P - 1) + 1);
tot = 0;
now = P - 1;
for (int i = 2; i <= tmp; i++)
{
if (now % i == 0)
{
A[tot++] = i;
}
while (now % i == 0)
{
now /= i;
}
}
if (now != 1)
{
A[tot++] = now;
}
return ;
}
long long QPow(long long x, long long n)
{
long long ret = 1;
while (n)
{
if (n & 1)
{
ret = ret * x % P;
}
n >>= 1;
x = x * x % P;
}
return ret;
}