51nod 1135 原根(求素数最小原根)
来源:互联网 发布:ubantu安装mysql数据库 编辑:程序博客网 时间:2024/05/22 10:43
题目链接:
51nod 1135 原根
题意:
求素数p的最小原根。
#include <stdio.h>#include <algorithm>#include <cmath>#include <iostream>#include <string.h>#include <cstring>using namespace std;const int MAX_N = 1000010;typedef long long ll;int prime_cnt, factor_cnt, p;int vis[MAX_N], prime[MAX_N], factor[MAX_N];void GetPrime(){ prime_cnt = 0; memset(vis, 0, sizeof(vis)); for(int i = 2; i < MAX_N; i++){ if(!vis[i]){ prime[prime_cnt++] = i; for(int j = 0; j < prime_cnt && prime[j] * i < MAX_N; j++){ vis[i * prime[j]] = 1; if(i % prime[j] == 0) break; } } }}void Factor(int x){ factor_cnt = 0; int t = (int) sqrt(x + 0.5); for(int i = 0; prime[i] <= t; i++){ if(x % prime[i] == 0){ factor[factor_cnt++] = prime[i]; while(x % prime[i] == 0) x /= prime[i]; } } if(x > 1) factor[factor_cnt++] = x;}ll quick_pow(ll n, ll m, ll mod){ ll res = 1, tmp = n % mod; while(m){ if(m & 1) res = res * tmp % mod; tmp = tmp * tmp % mod; m >>= 1; } return res;}void solve(){ Factor(p - 1); for(int g = 2; g < p; g++){ bool flag = true; for(int i = 0; i < factor_cnt; i++){ int t = (p - 1) / factor[i]; if(quick_pow((ll)g, (ll)t, (ll)p) == 1){ flag = false; break; } } if(flag){ cout << g << endl; break; } }}int main(){ GetPrime(); while(cin >> p){ solve(); } return 0;}
0 0
- 51nod 1135 原根(求素数最小原根)
- 51Nod 1135 求一个奇质数的最小原根
- 51Nod 1135-原根(快速求解一个素数的原根)
- 51Nod 1135-原根(快速求解一个素数的原根)
- 51nod oj 1135 【枚举---最小原根】
- 51nod 1135 原根
- 51nod 1135 原根
- 【51nod 1135 原根】
- 51nod-1135:原根
- 51nod 1135 原根
- 51nod 1135 原根
- 51nod 1135 原根
- 51nod 1135 原根
- 51 Nod 1135 原根
- 51 NOD 1135 原根
- 51nod 1135原根
- 51Nod 1135 原根
- 51nod 1135 原根
- Sicily1544——Integer Generator
- Android M MO流程 并与Android L MO对比
- Leetcode Regular Expression Matching O(n^2) DP
- HDUOJ_2564_词组缩写
- C++第六次实验-项目1
- 51nod 1135 原根(求素数最小原根)
- 软件工程(十九)
- HDUOJ_2567_寻梦
- 生产者和消费者案例
- JDBC连接MySQL步骤
- php preg_match_all函数笔记
- C++作业6
- JS封装简单后代选择器
- C++第六次作业