zoukankan      html  css  js  c++  java
  • UVA 10692 Huge Mods(指数循环节)

    指数循环节,由于a ^x = a ^(x % m + phi(m)) (mod m)仅在x >= phi(m)时成立,故应注意要判断

    //by:Gavin http://www.cnblogs.com/IMGavin/
    //指数循环节 递归处理
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<utility>
    using namespace std;
    typedef long long LL;
    const int N = 10008, INF = 0x3F3F3F3F;
    LL a[N], mod, n;
    int phi[N];
    void allPhi(int n){
        memset(phi,0,sizeof(phi));
        phi[1]=1;
        for(int i=2;i<=n;i++){
            if(!phi[i]){//则i为素数
                phi[i]=i;
                for(int j=i;j<=n;j+=i){
                        if(!phi[j]){
                            phi[j]=j;
                        }
                    phi[j]=phi[j]/i*(i-1);
                }
            }
        }
    }
    LL PowMod(LL a,LL b,LL MOD){
    	LL ret=1;
    	while(b){
    		if(b&1){
                ret = ret * a % MOD;
    		}
    		a = a * a % MOD;
    		b>>=1;
    	}
    	return ret;
    }
    
    bool check(LL a, LL n, LL m){
        if(a == 1){
            return false;
        }
        LL ans = 1;
        for(int i = 0; i < n; i++){
            ans *= a;
            if(ans >= m){
                return true;
            }
        }
        return false;
    }
    
    LL dfs(LL d, LL m, bool &sym){
        if(d == n){
            if(a[d] >= m){
                sym = 1;
            }else{
                sym = 0;
            }
            return a[d] % m;
        }
        bool flag;
        LL p = dfs(d + 1, phi[m], flag);
        if(flag){
            p += phi[m];
        }
        sym = check(a[d], p, m);
        return PowMod(a[d], p, m);
    }
    
    int main(){
        allPhi(N - 2);
        int t = 0;
        while(cin >> mod){
            cin >> n;
        	for(int i = 1; i <= n; i++){
        		cin >> a[i];
        	}
        	bool flag;
        	printf("Case #%d: %lld
    ", ++t, dfs(1, mod, flag) % mod);
        }
        return 0;
    }
    

      

  • 相关阅读:
    HDU6808 Go Running(未解决问题
    K
    E
    D
    B
    I
    HDU 2255 奔小康赚大钱 (KM算法模板)
    hdu 1150 Machine Schedule(二分图模板题)
    ACM-ICPC 2018 焦作赛区网络预赛G Give Candies(欧拉降幂)
    ACM-ICPC 2018 焦作赛区网络预赛 L:Poor God Water(杜教BM)
  • 原文地址:https://www.cnblogs.com/IMGavin/p/6124018.html
Copyright © 2011-2022 走看看