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\n",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无平方因子数)

*/
时间: 2024-11-01 19:35:30

HDU 5728 - PowMod的相关文章

HDU 5278 PowMod 数论公式推导

题意:中文题自己看吧 分析:这题分两步 第一步:利用已知公式求出k: 第二步:求出k然后使用欧拉降幂公式即可,欧拉降幂公式不需要互质(第二步就是BZOJ3884原题了) 求k的话就需要构造了(引入官方题解) 然后就求出k了,我就很奇怪为什么是这个式子,然后就网上搜啊搜 找到了一个推导(看完了以后恍然大悟) 推导链接:http://blog.csdn.net/wust_zzwh/article/details/51966450 高度仰慕数学好的巨巨 吐槽:这个题n是无平方因子,然后就要往欧拉函数是

HDU 1075 What Are You Talking About (Trie树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map可以过...我上的字典树,小bug有点尴尬,题目没有明确给出数据范围也是无奈. 贡献了几次RE 一次WA.尴尬.discuss里面有个说注意前缀的到是给了点tip.总体来说不错 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algorithm> 4 #include <

HDU 4869 Turn The Pokers 思维+组合

HDU 4869题意:m张牌,朝上状态为1,朝下状态为0,现在有n个操作 第i次操作可以反转任意xi张牌初始牌全部朝下,n,m<=1e5,问n次操作后能得到多少种不同的状态? 关心的是最后的状态 假如1有x个 则贡献C(m,x)种状态因为每翻转一次,1的个数和0的个数都相差2. 当每轮最少得到x个1,最多得到y个1 则1的个数范围[x,x+2...y-2,y]中都能取到,维护1的可取个数 组合数累加即可. #include <bits/stdc++.h> using namespace

HDU 3049 Data Processing 数论题解

Problem Description Chinachen is a football fanatic, and his favorite football club is Juventus fc. In order to buy a ticket of Juv, he finds a part-time job in Professor Qu's lab. And now, Chinachen have received an arduous task--Data Processing. Th

HDU 6053 - TrickGCD

/* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] 题意: 给出数列 A[N],问满足: 1 <= B[i] <= A[i] ; 对任意(l, r) (1<=l<=r<=n) ,使得 gcd(bl,...br) >= 2 ; 的 B[N] 数列的个数 分析: 设 gcd(b1,...bn) = k (k >= 2),此时 k 对答案的贡献为 (a1/k)*(a2/k)*(a3/k)*...*(an/k) 根据容斥原理,ans = +[k=

HDU 1180 诡异的楼梯 (搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 TLE n次.. 注意两点:1,S.T这三种位置是可以停留一秒的.即在没有路可走的时候可以停留一秒. 2, bfs宽搜应该使用优先队列, 并且vis标记加在将next节点push到队列中的时候. 然后就是奇偶判断什么的就可以了. 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algor

Hdu 5446 Unknown Treasure(Lucas+中国剩余定理)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5446 思路:Lucas求出所有a[i]=C(n,m)%m[i],中国剩余定理求出最终结果x (LL*LL会爆掉,手写乘法). 中国剩余定理: 设m1,m2,....mn是两两互质的正整数,对任意给定的整数a1,a2,....an必存在整数,满足 x≡a1 (mod m1),x≡a2 (mod m2),x≡a3 (mod m3)...... 并且满足上列方程组的解x(mod m1m2m3.....mn

2014多校联合八(HDU 4945 HDU 4946 HDU 4948 HDU 4950 HDU 4951 HDU 4952)

HDU 4945 2048 题意:给你一堆数字  问有几个子集可以拼出2048 思路: 拼数字的规则相当于让数字乘二  所以不是2^i的数字不会拼出2048  那么这些数可选可不选  即为2^cnt种可能 之后只要计算出有几个子集不可能拼出2048即可  不过简单的直接dp是2048*100000的复杂度的  会TLE 所以要变成先枚举元素  再枚举该种元素个数  再枚举2048种状态  然后利用组合求(组合里需要逆元) 为什么这样快?  因为比如枚举2^5这个元素的时候  最多取2^6个  枚

HDU 6057 Kanade&#39;s convolution

题目链接:HDU-6057 题意: 思路:先按照官方题解推导出下面的式子: 现在唯一的问题就是怎么解决[bit(x)-bit(y)=bit(k)]的问题. 我们定义\( F(A,k)_{i}=\left[ bit\left( i\right) =k\right] * A_{i} \),相当于把A.B.C分别按照bit划分成m+1个序列. 有如下公式: 同时我们发现\( C_k=F(C,bit(k)))_k \). 然后我们就可以搞出来啦! 代码: 1 #include<iostream> 2