• 【题解】Huge Mods UVa 10692 欧拉定理


    题意:计算a1^( a2^( a3^( a4^( a5^(...) ) ) ) ) % m的值,输入a数组和m,不保证m是质数,不保证互质

    裸的欧拉定理题目,考的就一个公式 a^b = a^( b % phi(m) + phi(m) ) ( mod m ),这个公式的前提条件是 b >= phi(m)

    但是这道题并不需要判断b >= phi(m)的条件,直接用公式就能过掉,而且udebug的标程也是错的

    而且我也不知道像这样的形式如何判断b >= phi(m),如果有神犇会的话欢迎教教本蒟蒻

    一组叉掉std和我的程序的数据:8 2 6 2,答案是4,程序输出0。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cmath>
     5 #include <utility>
     6 
     7 using namespace std;
     8 const int MAXN = 11;
     9 
    10 int m, n, a[MAXN];
    11 
    12 int phi( int x ) {
    13     int ans = x;
    14     for( int i = 2; i*i <= x; ++i )
    15         if( x % i == 0 ) {
    16             ans = ans / i * (i-1);
    17             while( x % i == 0 ) x /= i;
    18         }
    19     if( x > 1 ) ans = ans / x * (x-1);
    20     return ans;
    21 }
    22 int pow_mod( int a, int b, int m ) {
    23     if( !b ) return 1;
    24     int rtn = pow_mod(a,b/2,m);
    25     rtn = rtn * rtn % m;
    26     if( b&1 ) rtn = rtn * a % m;
    27     return rtn;
    28 }
    29 
    30 int solve( int i, int mod ) {
    31     if( i == n-1 ) return a[i] % mod;
    32     int b = solve( i+1, phi(mod) ); // 这里没有判断b >= phi(mod),直接就过掉了
    33     return pow_mod( a[i], b+phi(mod), mod );
    34 }
    35 
    36 int main() {
    37     int kase = 1;
    38     while( scanf( "%d", &m ) == 1 ) {
    39         scanf( "%d", &n );
    40         for( int i = 0; i < n; ++i ) scanf( "%d", a+i );
    41         printf( "Case #%d: %d
    ", kase++, solve(0,m) );
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    浅谈JavaScript中forEach与each
    Angular.js中使用$watch监听模型变化
    整理:Javascript获取数组中的最大值和最小值的方法汇总
    自定义指令的参数
    ng-disabled 不起作用的解决办法
    理解Angular中的$apply()以及$digest()
    $q -- AngularJS中的服务(理解)
    正则表达式30分钟入门教程(转)
    angular.extend用法实例
    使用angular.bootstrap() 完成模块的手动加载
  • 原文地址:https://www.cnblogs.com/mlystdcall/p/6603638.html
Copyright © 2020-2023  润新知