• 2^x mod n = 1 HDU


    2^x mod n = 1

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 20711    Accepted Submission(s): 6500


    Problem Description
    Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
     
    Input
    One positive integer on each line, the value of n.
     
    Output
    If the minimum x exists, print a line with 2^x mod n = 1.

    Print 2^? mod n = 1 otherwise.

    You should replace x and n with specific numbers.
     
    Sample Input
    2 5
     
    Sample Output
    2^? mod 2 = 1 2^4 mod 5 = 1
     
    Author
    MA, Xiao
     
    Source
     
    Recommend
    Ignatius.L
     
    能不能不用暴力
    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <cctype>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <list>
    #include <cmath>
    #include <bitset>
    #define rap(i, a, n) for(int i=a; i<=n; i++)
    #define rep(i, a, n) for(int i=a; i<n; i++)
    #define lap(i, a, n) for(int i=n; i>=a; i--)
    #define lep(i, a, n) for(int i=n; i>a; i--)
    #define rd(a) scanf("%d", &a)
    #define rlld(a) scanf("%lld", &a)
    #define rc(a) scanf("%c", &a)
    #define rs(a) scanf("%s", a)
    #define rb(a) scanf("%lf", &a)
    #define rf(a) scanf("%f", &a)
    #define pd(a) printf("%d
    ", a)
    #define plld(a) printf("%lld
    ", a)
    #define pc(a) printf("%c
    ", a)
    #define ps(a) printf("%s
    ", a)
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 1100000, INF = 0x7fffffff;
    int prime[maxn + 10], phi[maxn + 10];
    bool vis[maxn + 10];
    int n, ans;
    
    void getphi()
    {
        ans = 0;
        phi[1] = 1;
        for(int i = 2; i <= maxn; i++)
        {
            if(!vis[i])
            {
                prime[++ans] = i;
                phi[i] = i - 1;
            }
            for(int j = 1; j <= ans; j++)
            {
                if(i * prime[j] > maxn) break;
                vis[i * prime[j]] = 1;
                if(i % prime[j] == 0)
                {
                    phi[i * prime[j]] = phi[i] * prime[j];
                    break;
                }
                else
                    phi[i * prime[j]] = phi[i] * (prime[j] - 1);
    
            }
        }
    }
    
    int q_pow(int a, int b, int mod)
    {
        int res = 1;
        while(b)
        {
            if(b & 1) res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }
    
    
    vector<int> v;
    
    int main()
    {
        getphi();
        while(cin >> n)
        {
            v.clear();
            if(n % 2 == 0 || n == 1)
            {
                printf("2^? mod %d = 1
    ", n);
                continue;
            }
            int res = phi[n];
            for(int i = 2; i <= sqrt(phi[n] + 0.5); i++)
            {
                if(res % i == 0)
                    v.push_back(i), v.push_back(res / i);
            }
            sort(v.begin(), v.end());
            for(int i = 0; i < v.size(); i++)
            {
                if(q_pow(2, v[i], n) == 1)
                {
                    res = v[i];
                    break;
                }
    
            }
    
                    printf("2^%d mod %d = 1
    ", res, n);
    
        }
    
    
        return 0;
    
    }

    2^x mod n = 1

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 20711    Accepted Submission(s): 6500


    Problem Description
    Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
     
    Input
    One positive integer on each line, the value of n.
     
    Output
    If the minimum x exists, print a line with 2^x mod n = 1.

    Print 2^? mod n = 1 otherwise.

    You should replace x and n with specific numbers.
     
    Sample Input
    2 5
     
    Sample Output
    2^? mod 2 = 1 2^4 mod 5 = 1
     
    Author
    MA, Xiao
     
    Source
     
    Recommend
    Ignatius.L
  • 相关阅读:
    洛咕 P2403 [SDOI2010]所驼门王的宝藏
    洛咕 P2480 [SDOI2010]古代猪文
    洛咕 P2447 [SDOI2010]外星千足虫
    CF618F Double Knapsack 构造、抽屉原理
    Educational Codeforces Round 62
    CF908G New Year and Original Order 数位DP
    CF833D Red-Black Cobweb 点分治、树状数组
    Codechef CNTL Counting is life 生成函数
    LOJ2527 HAOI2018 染色 生成函数、二项式反演、NTT
    Luogu4916 魔力环 莫比乌斯反演、组合、生成函数
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/10800970.html
Copyright © 2020-2023  润新知