zoukankan      html  css  js  c++  java
  • UVA-10692 Huge Mods

    题目大意:计算a1^a2^a3^a4......^an模m的值。

    题目解析:幂取模运算的结果一定有周期。一旦找到周期就可把高次幂转化为低次幂。有降幂公式

            (a^x)%m=(a^(x%phi(m)+phi(m))%m  x>=phi(m)

    其中,phi()函数是欧拉函数。

    代码(代码有瑕疵)如下:

     1 # include<iostream>
     2 # include<cstdio>
     3 # include<cstring>
     4 # include<algorithm>
     5 using namespace std;
     6 # define ll long long
     7 int num[12],n;
     8 char start[8];
     9 int phi(int x)
    10 {
    11     int m=x;
    12     int ans=x;
    13     for(int i=2;i*i<=x;++i){
    14         if(m%i==0){
    15             ans=ans/i*(i-1);
    16             while(m%i==0)
    17                 m/=i;
    18         }
    19     }
    20     if(m>1)
    21         ans=ans/m*(m-1);
    22     return ans;
    23 }
    24 int mypow(int a,int b,int m)
    25 {
    26     int res=1;
    27     while(b){
    28         if(b&1)
    29             res=res*a%m;
    30         b>>=1;
    31         a=a*a%m;
    32     }
    33     return res;
    34 }
    35 int work(int i,int m)
    36 {
    37     if(i==n-1)
    38         return num[i]%m;
    39     int tm=phi(m);         
    40     int nm=work(i+1,tm)+tm;    
    41     return mypow(num[i],nm,m);
    42 }
    43 int main()
    44 {
    45     int cas=0;
    46     while(scanf("%s",start)&&start[0]!='#')
    47     {
    48         int mod=0;
    49         for(int i=0;i<strlen(start);++i)
    50             mod=mod*10+start[i]-'0';
    51         scanf("%d",&n);
    52         for(int i=0;i<n;++i)
    53             scanf("%d",&num[i]);
    54         printf("Case #%d: %d
    ", ++cas, work(0, mod));
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    js 正则表达式 test match exec三个方法的异同
    网页使用MD5加密
    解决Google地图和字体api无法加载的问题(转)
    Javascript 的addEventListener()及attachEvent()区别分析
    get与post的区别
    清除浮动的几种方法
    zoom属性(IE私有属性)
    class,id和name的区别
    深夜偷精之反射函数
    jQuery和js区别
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4707890.html
Copyright © 2011-2022 走看看