Codeforces 906D(欧拉降幂定理? + 唯一分解定理)

原创 2018年04月16日 21:13:45

莫名其妙的欧拉降幂定理,网上也找不到证明和解释,只有这个博客,但是神奇的可以ac,不知道快速幂为什么写成这个样子,正常的快速幂还要wa,觉得很奇怪,真的是我太菜了。。。

刚刚突然想明白了快速幂为什么写成这个样子。。。刚才自己好傻还想了半天,写成这个样就是普通的快速幂,不过是符合题目要求而已。。。(将一个数的次方换成欧拉降幂定理之后的形式)
φ = 1 的时候也很好理解,此时等号右边的平方是确定值即 1 ,此时递归可以结束,返回值为L

//代码应该是正确的,虽然没法理解,但是可以记录下来当模板使用
博客中的代码:
#include<bits/stdc++.h>  
#define Mod(a,b) a<b?a:a%b+b                     //重定义取模,按照欧拉定理的条件  
#define LL long long  
#define N 100010  
using namespace std;  
  
LL n,q,mod,a[N];  
map<LL,LL> mp;  
  
LL qpow(LL x,LL n,LL mod)  
{  
    LL res=1;  
    while(n)  
    {  
        if (n&1) res=Mod(res*x,mod),n--;  
        x=Mod(x*x,mod); n>>=1;  
    }  
    return res;  
}  
  
LL phi(LL k)  
{  
    LL i,s=k,x=k;  
    if (mp.count(k)) return mp[x];                  //记忆化存储  
    for(i = 2;i * i <= k; i++)  
    {  
        if(k % i == 0) s = s / i * (i - 1);  
        while(k % i == 0) k /= i;  
    }  
    if(k > 1) s = s / k * (k - 1);  
    mp[x]=s; return s;  
}  
  
LL solve(LL l,LL r,LL mod)  
{  
    if (l==r||mod==1) return Mod(a[l],mod);                 //如果到右端点或者φ值等于1,那么直接返回当前数字  
    return qpow(a[l],solve(l+1,r,phi(mod)),mod);            //否则指数为[l+1,r]区间的结果  
}  
  
int main()  
{  
    scanf("%lld%lld",&n,&mod);  
    for(int i=1;i<=n;i++)  
        scanf("%lld",&a[i]);  
    scanf("%lld",&q);  
    while(q--)  
    {  
        int L,R;  
        scanf("%d%d",&L,&R);  
        printf("%lld\n",solve(L,R,mod)%mod);                //对mod取模,因为qpow内部是用Mod(a,b)取模  
    }  
    return 0;  
}  
其中有一段代码:
LL phi(LL k)  
{  
    LL i,s=k,x=k;  
    if (mp.count(k)) return mp[x];                  //记忆化存储  
    for(i = 2;i * i <= k; i++)  
    {  
        if(k % i == 0) s = s / i * (i - 1);  
        while(k % i == 0) k /= i;  
    }  
    if(k > 1) s = s / k * (k - 1);  
    mp[x]=s; return s;  
}  

返回值是欧拉函数值,一开始有点懵,仔细一看就是唯一分解定理
将一个数分解,各种质因子,然后运用欧拉函数求解方式
φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1、p2…pk为n的所有素因子,可以求得欧拉函数值,值得学习。。上面的代码就当模板用吧先。。
版权声明:弱鸡弱鸡弱的一匹 https://blog.csdn.net/qq_41444888/article/details/79966571

CodeForces 906D Power Tower(欧拉降幂定理)

一道定理题。         大致题意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右一次垒起来的次方的幂对m取模之后的数字是多少。         根据欧拉降幂公式:,这个式子当...
  • u013534123
  • u013534123
  • 2017-12-27 15:25:07
  • 381

Codeforces 906D:Power Tower-扩展欧拉定理

传送门 题意: 给你n个数w和一个数p,q个询问,每次询问一个区间[l,r],求w_l^{(w_{l+1}^{(w_{l+2}…^{w_r})})}\mod p Solution: 这...
  • Charlie_jilei
  • Charlie_jilei
  • 2018-02-04 14:59:38
  • 114

Hdu 3221 Brute-force Algorithm (矩阵 欧拉定理降幂)

利用迭代思想,最后推得的规律和Hdu4549一样,我的Hdu4549题解:http://blog.csdn.net/whyorwhnt/article/details/12858485 本题与Hdu4...
  • whyorwhnt
  • whyorwhnt
  • 2013-10-18 22:14:44
  • 1358

hdu3221 扩展欧拉定理(降幂大法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3221 题解:首先很容易发现递推公式fn=fn-1*fn-2;写出前几项a,b,a*b,a*b^2,a...
  • mosquito_zm
  • mosquito_zm
  • 2017-08-16 16:58:35
  • 282

3884: 上帝与集合的正确用法 欧拉函数+降幂公式

Orz题解 降幂公式:a^x ≡a^(x modϕ(p)+ϕ(p)) (mod p)#include #include #include #define ll long long using na...
  • Phenix_2015
  • Phenix_2015
  • 2016-02-15 15:22:43
  • 844

【BZOJ 3884】上帝与集合的正确用法【欧拉降幂】

题目: 做法: 欧拉降幂:ax≡ax mod ϕ(p)+ϕ(p)(mod p) (x≥p)a^x\equiv a^{x \ mod \ \phi(p) + \phi(p)} (mod \ ...
  • Pedro_Lee
  • Pedro_Lee
  • 2016-05-20 08:14:33
  • 778

FZU 1759 Super A^B mod C (欧拉函数,快速幂,降幂公式)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 一道吓人的题。。 不禁再次感叹数学真伟大,使用下面的降幂公式很简单就写出来了。 phi是欧...
  • Strokess
  • Strokess
  • 2016-04-23 20:09:13
  • 2084

欧拉降幂公式—— BZOJ 3884 && FZU 1759

C - Super A^B mod CGiven A,B,C, You should quickly calculate the result of A^B mod C. (1
  • chudongfang2015
  • chudongfang2015
  • 2017-08-08 17:58:13
  • 366

【扩展欧拉定理-降幂大法】Balkan OI 2016[数塔]题解

题目概述求 xx⋮xn21 mod px_1^{x_2^{\vdots^{x_n}}}\ mod\ p 。 解题报告欧拉定理: aφ(p)≡1(mod p)⇔ab≡ab mod φ(n)(mod p)...
  • zzkksunboy
  • zzkksunboy
  • 2017-12-21 20:58:59
  • 152

Summer Training day4 欧拉降幂

Input 2 Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The...
  • weixin_37517391
  • weixin_37517391
  • 2017-08-07 19:04:36
  • 108
收藏助手
不良信息举报
您举报文章:Codeforces 906D(欧拉降幂定理? + 唯一分解定理)
举报原因:
原因补充:

(最多只允许输入30个字)