Uva 10629 Huge Mods (指数循环节)

题意:求 a1ˆa2ˆa3ˆ. . .ˆaN mod m

思路:利用 和递归求解

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N=15;
typedef long long ll;
int MOD;
int A[N],k;

int phi(int n)
{
    int rea = n;
    for(int i=2; i*i<=n; i++)
    {
        if(n % i == 0)
        {
            rea = rea - rea / i;
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1)
        rea = rea - rea / n;
    return rea;
}

ll qmulti(ll a,ll b,ll m)
{
    ll ans = 0;
    a %= m;
    while(b)
    {
        if(b & 1)
        {
            ans = (ans + a) % m;
            b--;
        }
        b >>= 1;
        a = (a + a) % m;
    }
    return ans;
}

ll qmod(ll a,ll b,ll m)
{
    ll ans = 1;
    a %= m;
    while(b)
    {
        if(b & 1)
        {
            ans = qmulti(ans,a,m);
            b--;
        }
        b >>= 1;
        a = qmulti(a,a,m);
    }
    return ans;
}

ll Solve(int num,ll mod)
{
    if(num==k) return A[num]%mod;
    ll tmp=phi(mod);
    ll c=Solve(num+1,tmp)+tmp;
    return qmod(A[num],c,mod);
}

int main()
{
    char str[15];
    int cnt=0;
    ll ans;
    while(scanf("%s",str)!=-1)
    {
        if(strcmp(str,"#")==0) break;
        sscanf(str,"%d",&MOD);
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&A[i]);
        }
        ans = Solve(1,MOD);
        cnt++;
        cout<<"Case #"<<cnt<<": "<<ans<<endl;
    }
    return 0;
}

 

 

 

posted @ 2017-04-08 22:42  simpleknight  阅读(228)  评论(0编辑  收藏  举报