zoukankan      html  css  js  c++  java
  • HDU2837 Calculation(扩展欧拉定理)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3121    Accepted Submission(s): 778


    Problem Description
    Assume that f(0) = 1 and 0^0=1. f(n) = (n%10)^f(n/10) for all n bigger than zero. Please calculate f(n)%m. (2 ≤ n , m ≤ 10^9, x^y means the y th power of x).
     
    Input
    The first line contains a single positive integer T. which is the number of test cases. T lines follows.Each case consists of one line containing two positive integers n and m.
     
    Output
    One integer indicating the value of f(n)%m.
     
    Sample Input
    2 24 20 25 20
     
    Sample Output
    16 5
     
    Source
     
    Recommend
    gaojie   |   We have carefully selected several similar problems for you:  2841 2839 2838 2840 2836 
     
    $a^x equiv a^{x   \%   phi(m) + phi(m)} pmod m$
    然后直接上就行了。
    有很多奇怪的边界问题,比如求$f(n)$的时候一模就炸。。
     
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define int long long 
    using namespace std;
    const int MAXN = 1e5 + 10, INF = 1e9 + 10;
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int N, M, PhiM;
    int fastpow(int a, int p, int mod) {
        if(a == 0) return p == 0;
        int base = 1;
        while(p) {
            if(p & 1) base = (base * a) % mod;
            p >>= 1; a = (a * a) % mod;
        }
        return base == 0 ? mod : (base + mod)% mod;
    }
    int GetPhi(int x) {
        int limit = sqrt(x), ans = x;
        for(int i = 2; i <= limit; i++) {
            if(!(x % i)) ans = ans / i * (i - 1) ;
            while(!(x % i)) x /= i;
        }
        if(x > 1) ans = ans / x * (x - 1);
        return ans;
    }
    int F(int N, int mod) {
        if(N < 10) return N;
        return fastpow((N % 10), F(N / 10, GetPhi(mod)), mod);
    }
    main() { 
        int QwQ = read();
        while(QwQ--) {
            N = read(); M = read();
            printf("%I64d
    ", F(N, M));
        }
        return 0;
    }
    /*
    4
    24 20
    37 25
    123456 321654
    123456789 456789321
    */
  • 相关阅读:
    试试 cocos creator 3.0 还算可以
    安卓按键辅助(类似按键精灵)
    一次github遭遇
    NSString
    Navicat for SQL Server V10.0.10
    申请博客第一天
    Google Earth的脫機應用-本地模擬瓦片系統
    Vs2010+opencv2.3.1 imread出现异常
    tcpdump工具注意事项
    选择服务器托管机房的注意事项
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9279227.html
Copyright © 2011-2022 走看看