[扩展欧拉定理例题]降幂大法

降幂大法1

题面:

  给出a,b,p,计算a^b %p 的结果,0< a <= 10^9,0< b <= 10^10000,0< p <= 10^9。

思路:

  10的10000次方,这题不简单。那么经过欧拉定理的学习之后,有如下结论:,其中a,n互质,但是很显然,他不能用来解决这道题。那么扩展欧拉定理应运而生了。

  ac≡acmodφ(m)+φ(m)(mod m)

  其中c>=φ(m)。他很强,强到了一种逆天的程度。对于这个定理,我有一个优雅的证明,但是在网上打不出来。又及,c<φ(m)的时候直接快速幂。

  回到这道题,这道题无非就是用扩展欧拉定理去解决它,虽然它的p在后面很恶心。

  先把所有的东西读进来,处理好φ(p),再对指数进行类似于快读的处理。由于快读只涉及到加和乘,完全可以一边算一遍%φ(p)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<fstream>
using namespace std;
#define ll long long
ll a,b,p,mod;
char s[100005];
ll phi(int n){
    ll ans=n;
    for(int i=2;i*i<=n;++i){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0)n/=i;
        }
    }
    if(n>1)ans=ans/n*(n-1);
    return ans;
}
long long KSM(ll a,ll b){
    ll sp=1;
    while(b){
        if(b&1)sp*=a;
        sp%=p;
        b>>=1;
        a=a*a;
        a%=p;
    }
    return sp;
}
int main(){
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    scanf("%lld%s%lld",&a,s,&p);
    int len=strlen(s);
    mod=phi(p);
    int flag=0;
    for(int i=0;i<len;++i){
        b=b*10+(s[i]-‘0‘);
        if(b>=mod)flag=1;
        b%=mod;
    }
    if(flag)b+=mod;
    cout<<KSM(a,b)%p<<endl;
    return 0;
}

降幂大法2

题面:

  

思路:

  禁止套娃!!是的,看到省略号的时候我就直接懵了。你管这个叫题?分明就是俄罗斯套娃。

  但是是套娃,又有答案,那他就不是无限套娃(世 界 崩 坏)。见过俄罗斯套娃的都知道,套娃必然会有一个最小的,此题个关键就在于找出最小的套娃。

  由扩展欧拉定理可以知道,一个数膜另外一个数,这个任务可以甩给他的指数。指数又甩给它的指数,这就是套娃。于是这样我们可以设计一个函数,先令T=22...他的任务是解决T%p的问题,于是无限递归处理,然后p在不断地phi,phi,phi,phi...直到φ(p)=1,那么很显然的,一个数%1=0.套娃结束。最小的娃找到了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<fstream>
using namespace std;
#define ll long long
ll a,b,p;
char s[100005];
ll phi(int n){
    ll ans=n;
    for(int i=2;i*i<=n;++i){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0)n/=i;
        }
    }
    if(n>1)ans=ans/n*(n-1);
    return ans;
}
long long KSM(ll a,ll b,ll mod){
    ll sp=1;
    while(b){
        if(b&1)sp*=a;
        sp%=mod;
        b>>=1;
        a=a*a;
        a%=mod;
    }
    return sp;
}
int solve(int p){
    int k=phi(p);
    if(k==1)return 0;
    return KSM(2,(solve(k)+k),p);
}
int main(){
    while(scanf("%lld",&p)!=EOF){
        cout<<solve(p)<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/clockwhite/p/12076852.html

时间: 2024-10-11 08:06:21

[扩展欧拉定理例题]降幂大法的相关文章

fzu1759 Super A^B mod C 扩展欧拉定理降幂

扩展欧拉定理: \[ a^x \equiv a^{x\mathrm{\ mod\ }\varphi(p) + x \geq \varphi(p) ? \varphi(p) : 0}(\mathrm{\ mod\ }p)\] #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; ll aa, cc; char bb[100000

欧拉定理&amp;扩展欧拉定理(证明)

网上找到的某巨佬的博客,感觉很清晰. 顺便附一道例题:luogu P4139 上帝与集合的正确用法 欧拉定理&扩展欧拉定理(证明) 原文地址:https://www.cnblogs.com/Gkeng/p/11261781.html

【BZOJ3884】【降幂大法】上帝与集合的正确用法

Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容易发现,一共有两种不同的“α”. 第三天, 上帝又创造了一个新的元素,称作“β”.“β”被定义为“α”构成的集合.容易发现,一共有四种不同的“β”. 第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合.显然,一共会有16种不同的“γ”. 如果按照这样下去,上帝创造的第四种元

[BZOJ 4869][SXOI2017]相逢是问候(扩展欧拉定理+线段树)

Description Informatik verbindet dich und mich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是 输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个到第r个数的和,也就是输出:sigma(ai),l<=i<=rai因为 这个结果可能会很大,所以你只需

[BZOJ 3884]上帝与集合的正确用法(扩展欧拉定理)

Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容易发现,一共有两种不同的“α”. 第三天, 上帝又创造了一个新的元素,称作“β”.“β”被定义为“α”构成的集合.容易发现,一共有四种不同的“β”. 第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合.显然,一共会有16种不同的“γ”. 如果按照这样下去,上帝创造的第四种元

【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone

Problem Description In ACM_DIY, there is one master called “Lost”. As we know he is a “-2Dai”, which means he has a lot of money.  Well, Lost use Ipad and IPhone to reward the ones who solve the following problem.  In this problem, we define F( n ) a

[BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Status][Discuss] Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每

小学扩展欧拉定理

学了一下扩展欧拉定理,不会证,记了个结论,笔记的话,随便去网上搜一搜吧.-bzoj3884:上帝与集合的正确用法无脑板子题额 #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; inline int Pow(int x,int y,int P){ int ret=1; while(y){ if(y&1)ret=(LL)ret*x%P; x=(LL)x*x%

CodeForces 907F Power Tower(扩展欧拉定理)

Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is usually made of power-charged rocks. It is built with the help of rare magic by levitating the current top of tower and adding rocks at its bottom. If