URAL 1226 Little Chu(最大原根)

原创 2016年05月31日 01:21:35

题目链接:
URAL 1226 Little Chu*
题意:
找到最大的k,使得k, k^2, k^3…k^x 模n的结果各不相同且x尽可能大。
分析:
求最大原根。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#include <bitset>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
const int MAX_N = 70000;

int T, n, prime_cnt, factor_cnt;
int prime[MAX_N], factor[MAX_N];
bitset<MAX_N> bs;

void GetPrime()
{
    bs.set();
    prime_cnt = 0;
    for(int i = 2; i < MAX_N; i++){
        if(bs[i] == 1) { prime[prime_cnt++] = i; }
        for(int j = 0; j < prime_cnt && i * prime[j] < MAX_N; j++){
            bs[i * prime[j]] = 0;
            if(i % prime[j] == 0) break;
        }
    }
}

void GetFactor(int x)
{
    factor_cnt = 0;
    for(int i = 0; i < prime_cnt && prime[i] * prime[i] <= x; 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;
    }
}

int quick_pow(int a, int b, int m)
{
    ll res = 1, tmp = (ll)a, mod = (ll)m;
    while(b){
        if(b & 1) res = res * tmp % mod;
        tmp = tmp * tmp % mod;
        b >>= 1;
    }
    return (int)res;
}

int main()
{
    GetPrime();
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        GetFactor(n - 1);
        int ans ;
        for(int i = n - 1; i >= 2; i--){
            int flag = true;
            for(int j = 0; j < factor_cnt; j++){
                if(quick_pow(i, (n - 1) / factor[j], n) == 1){
                    flag = false;
                    //printf("i = %d factor[j] = %d\n", i, factor[j]);
                    break;
                }
            }
            if(flag){
                ans = i;
                break;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
版权声明:缥缈玉京人,想语然、京兆眉妩。

Ural 1268 Little Chu (原根)

对于两个正整数,由欧拉定理可知,存在正整数, 比如说欧拉函数,即小于等于 m 的正整数中与 m 互质的正整数的个数,使得。 由此,在时,定义对模的指数为使成立的最小的正整数。由前知 一定小于等于 ...
  • u010710717
  • u010710717
  • 2014年01月20日 00:29
  • 1349

URAL 1268. Little Chu 求最大原根

题目来源:URAL 1268. Little Chu 题意:输入n 求一个最大的k 使得k^1 k^2 k^3...k^x mod n 后各不相同 思路:mod n 后各不相同 最多有 n个 那么此事...
  • u011686226
  • u011686226
  • 2014年09月20日 21:36
  • 935

Ural 1268. Little Chu 求原根

1268. Little Chu Time limit: 0.25 second Memory limit: 64 MB The favorite occupation of Little C...
  • jyysc2010
  • jyysc2010
  • 2013年08月15日 18:35
  • 589

Ural 1017. Staircases

1017. Staircases Time limit: 1.0 second Memory limit: 64 MB One curious child has a set o...
  • jyysc2010
  • jyysc2010
  • 2013年08月12日 10:10
  • 1484

poj 1284 求原根

题目大意:给出一个奇素数,求出他的原根的个数,定义n的原根x满足条件0 关于这道题。如果知道欧拉函数的话,看出的答案是phi(n-1)其实也不难 定理:如果p有原根,则它恰有φ(φ...
  • xiaolonggezte
  • xiaolonggezte
  • 2017年05月23日 11:20
  • 228

如何求原根

说这种最好就是举个例子 比如说求81的所有原根 先说欧拉函数通式: 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……p...
  • u012763794
  • u012763794
  • 2016年01月11日 18:12
  • 2234

密码学:求大数的本原根(MATLAB)

求解任何数的所有本原根(MATLAB实现)
  • Duke_Laurence
  • Duke_Laurence
  • 2016年10月27日 22:39
  • 732

ural 1017. Staircases

点击打开链接 1017. Staircases Time limit: 1.0 second Memory limit: 64 MB One curious c...
  • Dinivity123
  • Dinivity123
  • 2015年01月18日 13:26
  • 993

原根(详解+代码实现+例题+快速求解一个数的原根)

1.原根定义 假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1 简单来说,g^i mod p ≠ g^j mod p (p为素数) 其中i≠j且i, j介於1至(...
  • dreamzuora
  • dreamzuora
  • 2016年10月06日 16:59
  • 1279

原根-快速求解一个数的原根

1.原根定义 假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1 简单来说,g^i mod p ≠ g^j mod p (p为素数) 其中i≠j且i, j介於1至(...
  • zhang20072844
  • zhang20072844
  • 2013年09月10日 22:57
  • 19117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:URAL 1226 Little Chu(最大原根)
举报原因:
原因补充:

(最多只允许输入30个字)