51nod 1135 原根

来源:互联网 发布:淘宝钓鱼网站举报 编辑:程序博客网 时间:2024/06/06 07:09

1135 原根
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
设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

这道题老实说我也想了很久,最后实在想不出来了就去找了这位菊苣的博客看,然后根据他的思想最终还是写出来了:)

http://blog.csdn.net/u013486414/article/details/47781857


#include <iostream>  #include <cstdlib>  #include <cstring>  #include <cstdio>  using namespace std;  int P;  const int NUM = 32170;  int prime[NUM/4];  bool f[NUM];  int pNum = 0;  void getPrime()//线性筛选素数  {      for (int i = 2; i < NUM; ++ i)      {          if (!f[i])          {              f[i] = 1;              prime[pNum++] = i;          }          for (int j = 0; j < pNum && i*prime[j] < NUM; ++ j)          {              f[i*prime[j]] = 1;              if (i%prime[j] == 0)              {                  break;              }          }      }  }  __int64 getProduct(int a,int b,int P)//快速求次幂mod  {      __int64 ans = 1;      __int64 tmp = a;      while (b)      {          if (b&1)          {              ans = ans*tmp%P;          }          tmp = tmp*tmp%P;          b>>=1;      }      return ans;  }    bool judge(int num)//求num的所有的质因子  {      int elem[1000];      int elemNum = 0;      int k = P - 1;      for (int i = 0; i < pNum; ++ i)      {          bool flag = false;          while (!(k%prime[i]))          {              flag = true;              k /= prime[i];          }          if (flag)          {              elem[elemNum ++] = prime[i];          }          if (k==1)          {              break;          }          if (k/prime[i]<prime[i])          {              elem[elemNum ++] = prime[i];              break;          }      }      bool flag = true;      for (int i = 0; i < elemNum; ++ i)      {          if (getProduct(num,(P-1)/elem[i],P) == 1)          {              flag = false;              break;          }      }      return flag;  }  int main()  {            getPrime();      while (cin >> P)      {          for (int i = 2;;++i)          {              if (judge(i))              {                  cout << i<< endl;                  break;              }          }      }      return 0;  }  



0 0
原创粉丝点击