uva 10692——Huge Mods

来源:互联网 发布:骚男的淘宝店网址 编辑:程序博客网 时间:2024/06/06 02:32

题目大意:给定第一个数M,后面有n的数,求解a[1]^a[2]^a[3]^…..%m的解

 

思路:开始的时候并不知道从哪里下手,一开始收到前面某题除4的印象,然后一直对4取余,知道a[1],计算后发现那一套只适用于求解最后一位的情况,苦思敏想不得其解,最后不得不去找答案,原来涉及到剩余系定理,即a^b=a^(b%phi[M])+phi[M])(phi[M]M的欧拉函数) 如此一来,只是不断调用求解函数到最后一个即可。

 

Code

 

#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N=10005;int n,m;int a[15],phi[N];void tab(){    for (int i=2;i<=N;i++) phi[i]=0;    phi[1]=1;    for (int i=2;i<=N;i++)    {        if (phi[i]) continue;        for (int j=i;j<N;j+=i)        {            if (!phi[j]) phi[j]=j;        phi[j]=phi[j]/i*(i-1);        }    }}int pow_mod(int a,int n,int m){    int ans=1;    while (n)    {        if (n%2==1) ans=ans*a%m;        n/=2;        a=a*a%m;    }    return ans;}int cal(int i,int m){     //cout<<"bug"<<endl;    if (i==n-1) return a[i]%m;    int t=cal(i+1,phi[m]);    //cout<<"bug"<<endl;    return pow_mod(a[i],t+phi[m],m);}int main(){    tab();    int ca=1;    while (cin>>m)    {        scanf("%d",&n);        for (int i=0;i<n;i++)            scanf("%d",&a[i]);            int ans=cal(0,m);        printf("Case #%d: %d\n",ca++,ans);    }}
0 0
原创粉丝点击