• HDU 5728


    HDU 5728 - PowMod

    题意:
        定义: k = ∑(i=1,m) φ(i∗n) mod 1000000007


        给出: n,m,p ,且 n 无平方因子


        求: ans= k^(k^(k...k)) mod p  (k有无限个)
        
    分析:


        欧拉函数 + 指数循环节
        
        第一部分 求出 k.
              定理: 1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
              应用:
                  ∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数) ,可自行推导
        第二部分
              应用指数循环节化无限为有限,具体实现为递归操作
            
             指数循环节: A^x = A^(x % φ(C) + φ(C)) (mod C)  (x >= φ(C))

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 const int MOD= 1000000007;
     6 const int MAXN=1e7;
     7 int euler[MAXN+5];
     8 long long sum[MAXN+5];
     9 long long k,n,m,p;
    10 void GetEuler()
    11 {
    12     memset(euler,0,sizeof(euler));
    13     euler[1]=1;
    14     for(int i = 2;i <= MAXN;i++)
    15         if(!euler[i])
    16             for(int j = i;j <= MAXN;j += i)
    17             {
    18                 if(!euler[j]) euler[j]=j;
    19                 euler[j] = euler[j] / i * (i-1);
    20             }
    21     sum[1]=1;
    22     for(int i = 2;i <=MAXN; i++)
    23         sum[i] = (sum[i-1] + euler[i]) % MOD;
    24 }
    25 long long Get_K(long long n,long long m)
    26 {
    27     if(m==0) return 0;
    28     if(m==1) return euler[n];
    29     if(n==1) return sum[m];
    30     if(euler[n]==n-1) return (euler[n]*Get_K(1,m)%MOD + Get_K(n,m/n))%MOD;
    31     for(int i=2;i<MAXN;i++)
    32         if(n%i==0)
    33             return (euler[i] * Get_K(n/i,m)%MOD + Get_K(n,m/i) ) % MOD;
    34 }
    35 long long PowMod(long long a,long long b, long long mod)
    36 {
    37     long long r = 1;
    38     while(b)
    39     {
    40         if(b&1) r = (r*a)%mod;
    41         a= (a*a)%mod;
    42         b>>=1;
    43     }
    44     return r;
    45 }
    46 long long Cal(long long k, long long p)
    47 {
    48     if( p == 2) return k&1;//mod φ(p)
    49     return PowMod(k,Cal(k,euler[p])+euler[p],p);//递归的计算ans,递归出口为φ(p)=1
    50 }
    51 int main()
    52 {
    53     GetEuler();
    54     while(~scanf("%lld%lld%lld",&n,&m,&p))
    55     {
    56         k = Get_K(n,m);
    57         printf("%lld
    ",Cal(k,p));
    58     }
    59 }
    /*
    欧拉函数:
    对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。   例如euler(8)=4,因为1,3,5,7均和8互质。
    
    通式:
        对于一个正整数N的素数幂分解    N = (P1^q1) * (P2^q2) * ...* (Pn^qn).
            φ(1) = 1.
            φ(N) = N * (1-1/P1) * (1-1/P2) *...* (1-1/Pn).
    
    定理:
        1.欧拉函数是非完全积性函数: φ(m*n) = φ(n)*φ(m) , 当且仅当GCD(n,m) = 1.
        
        2.一个数的所有质因子之和是  euler(n)*n/2.
        
        3.若n是素数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质.
        
    特殊性质: 
        1.当n为奇数时,φ(2n) = φ(n).
        2.对于质数p,φ(p) = p - 1
        3.除了N=2,φ(N)都是偶数.
        
    指数循环节:
        A^x = A^(x % φ(C) + φ(C)) (mod C)  (x >= φ(C)) 
    
    定理1 应用:
        ∑(i=1,m)φ(i*n) = φ(pi) * ∑(i=1,m)φ(i*n/pi) + ∑(i=1,m/pi)φ(i*n) ; (n无平方因子数)
    
    */
    我自倾杯,君且随意
  • 相关阅读:
    jmeter BeanShell内置变量的基本使用
    自定义 resetCSS
    JavaScript + html 制作钟表
    JavaScript 实现放大镜效果
    JavaScript 实现拖拽
    JavaScript 阻止事件的默认行为
    JavaScript 事件冒泡
    JavaScript 鼠标事件、键盘事件
    JavaScript window.location
    JavaScript 中document.getElementsByClassName() 在ie8以下不兼容问题
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/5701852.html
Copyright © 2020-2023  润新知