小学扩展欧拉定理

学了一下扩展欧拉定理,不会证,记了个结论,笔记的话,随便去网上搜一搜吧.
-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%P,y>>=1;
    }
    return ret;
}
inline int Phi(int x){
    if(x==1)return 1;
    int i,ret=x;
    for(i=2;i*i<=x;++i)
        if(x%i==0){
            ret=ret/i*(i-1);
            while(x%i==0)x/=i;
        }
    if(x!=1)ret=ret/x*(x-1);
    return ret;
}
inline int Power(int P){
    if(P==1)return 0;
    int phi=Phi(P);
    return Pow(2,Power(phi)+phi,P);
}
int main(){
    int T,P;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&P);
        printf("%d\n",Power(P));
    }
    return 0;
}

Kod

-bzoj4869:[Shoi2017]相逢是问候
https://blog.sengxian.com/solutions/bzoj-4869
这道题的小细节还是比较坑的啊,比如:1.多加一个1;2.判断上一层和上一层模数的大小关系.(网上的人大概都是判0或者试乘,我写的是试乘,因为我不会证明判0的正确性,而且也看不懂除了试乘以外的方法)(我的试乘比较蠢,但是他的正确性我应该是证出来了)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
const int A=50;
const int N=50010;
const int F=1<<15;
const int oo=100000000;
int n,m,k,P,cmp,hp,phi[A],a[N],mi1[A][F+10],mi2[A][F+10];
inline int Pow(int x,int y,int P,int cur){
    int ret=(LL)mi1[cur][y&(F-1)]*mi2[cur][y>>15]%P;
    return ret;
}
inline int Pow_(int x,int y,int P,int cur){
    if(y>=cmp)return Pow(x,y,P,cur);
    LL ret=1;
    int i;
    for(i=1;i<=y;++i){
        ret*=x;
        if(ret>=P)return Pow(x,y,P,cur);
    }
    return ret+oo;
}
inline int Phi(int x){
  if(x==1)return 1;
  int i,ret=x;
  for(i=2;i*i<=x;++i)
    if(x%i==0){
      ret=ret/i*(i-1);
      while(x%i==0)x/=i;
    }
    if(x!=1)ret=ret/x*(x-1);
  return ret;
}
inline int Power(int rest,int aim,int P,int cur){
    if(!rest)return aim<P?aim+oo:aim%P;
    int ret=Power(rest-1,aim,phi[cur+1],cur+1);
    if(ret<oo)return Pow(k,ret+phi[cur+1],P,cur);
    return Pow_(k,ret-oo,P,cur);
}
struct Segment_Tree{
    Segment_Tree *ch[2];
    int hp,sum;
    inline void pushup(){
        sum=(ch[0]->sum+ch[1]->sum)%P;
        hp=ch[0]->hp+ch[1]->hp;
    }
}*root,node[N<<2];
int sz;
#define newnode (node+(sz++))
#define mid ((l+r)>>1)
inline void build(Segment_Tree *&p,int l,int r){
    p=newnode;
    if(l==r){
        p->hp=hp;
        p->sum=a[l];
        return;
    }
    build(p->ch[0],l,mid);
    build(p->ch[1],mid+1,r);
    p->pushup();
}
inline void dfs(Segment_Tree *p,int l,int r){
    if(!p->hp)return;
    if(l==r){
        --p->hp;
        p->sum=k==1?1:Power(hp-p->hp,a[l],P,0);
        if(p->sum>=oo)p->sum-=oo;
        return;
    }
    dfs(p->ch[0],l,mid);
    dfs(p->ch[1],mid+1,r);
    p->pushup();
}
inline void update(Segment_Tree *p,int l,int r,int z,int y){
    if(z<=l&&r<=y){
        dfs(p,l,r);
        return;
    }
    if(z<=mid)update(p->ch[0],l,mid,z,y);
    if(mid<y)update(p->ch[1],mid+1,r,z,y);
    p->pushup();
}
inline int query(Segment_Tree *p,int l,int r,int z,int y){
    if(z<=l&&r<=y)return p->sum;
    int ret=0;
    if(z<=mid)ret+=query(p->ch[0],l,mid,z,y);
    if(mid<y)ret+=query(p->ch[1],mid+1,r,z,y);
    return ret%P;
}
inline void Init(){
    scanf("%d%d%d%d",&n,&m,&P,&k);
    int cur=P,step=-1,i,j;
    while(true){
        phi[++step]=cur;
        if(cur==1)break;
        cur=Phi(cur);
    }
    hp=step;
    phi[++hp]=1;
    for(i=0;i<=hp;++i){
        mi1[i][0]=1%phi[i];
        for(j=1;j<F;++j)
            mi1[i][j]=(LL)mi1[i][j-1]*k%phi[i];
        cur=(LL)mi1[i][F-1]*k%phi[i];
        mi2[i][0]=1%phi[i];
        for(j=1;j<F;++j)
            mi2[i][j]=(LL)mi2[i][j-1]*cur%phi[i];
    }
    cmp=k==1?0:std::ceil(std::log(P)/std::log(k));
    for(i=1;i<=n;++i)
        scanf("%d",&a[i]);
    build(root,1,n);
}
inline void Work(){
    int opt,l,r;
    while(m--){
        scanf("%d%d%d",&opt,&l,&r);
        if(opt){
            printf("%d\n",query(root,1,n,l,r));
            continue;
        }
        update(root,1,n,l,r);
    }
}
int main(){
    Init();
    Work();
    return 0;
}

Kod

原文地址:https://www.cnblogs.com/TSHugh/p/8781624.html

时间: 2024-07-30 19:40:34

小学扩展欧拉定理的相关文章

[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种不同的“γ”. 如果按照这样下去,上帝创造的第四种元

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

[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)中的每

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

【CodeForces】906 D. Power Tower 扩展欧拉定理

[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [题解]扩展欧拉定理的形式: $$a^b\equiv a^{b\%\varphi(p)+\varphi(p)} \ \ mod \ \ p \ \ (b\leq \varphi(p))$$ 特别注意当b<φ(p)且(a,p)≠1时不变. 假如现在是三个累乘幂a^(b^c),那么根据扩展欧拉定理: $$a^

【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理

Description Informatikverbindetdichundmich. 信息将你我连结.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因为 这个结果可能会很大,所以你只需要输出结

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

一句话题面 求 $ 2^{2^{2^{...}}}  $ \(mod\) $p $ 题解 首先我们要知道什么是扩展欧拉定理: 如果\(b ≥ \varphi(p)\) \(a^b \equiv a^{b \ mod \ \varphi(p)\ +\ \varphi(p)} (mod \ p)\) 可以发现,在这道题中\(a=2\),\(b=2^{2^{2^{...}}}\) 然后我们发现$ 2^{2^{2^{...}}} $ 这玩意是 $ ≥ \varphi(p) $ 的 然后我们知道\(\va

同余|欧拉定理|费马小定理|扩展欧拉定理|扩展欧几里得算法

目录 同余 基本定理 欧拉定理 费马小定理 扩展欧拉定理 扩展欧几里得算法 同余 基本定理 欧拉定理 若a,m互质,则 \[ a^{\varphi\left ( m \right )}\equiv 1\left ( mod \ m \right ) \] 应用 令,,这两个数是互素的.比5小的正整数中与5互素的数有1.2.3和4,所以.计算:,而.与定理结果相符. 计算的个位数,实际是求被10除的余数.7和10互素,且.由欧拉定理知.所以. 费马小定理 若p是质数,则对于任意整数a,都有 \[