• CF906D Power Tower


    题目

    CF906D Power Tower

    分析

    首先根据扩展欧拉定理,我们可以得到一个递归柿子。

    又考虑到最多递归 (log) 次,于是可以直接枚举递归即可。

    注意快速幂的取模要满足扩展欧拉定理,同时 (varphi) 的值可以存起来。。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    template <typename T>
    inline void read(T &x){
        x=0;char ch=getchar();bool f=false;
        while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
        while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        x=f?-x:x;
        return ;
    }
    
    template <typename T>
    inline void write(T x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10^48);
        return ;
    }
    #define ll long long
    #define ull unsigned long long
    const int N=1e5+5;
    unordered_map<ll,ll>phi;
    ll n,m,q,a[N];
    inline void chk(ll &x,ll mod){if(x>=mod) x%=mod,x+=mod;}
    ll QuickPow(ll x,ll y,ll mod){ll res=1;while(y){if(y&1)	res=res*x,chk(res,mod);y>>=1;x=x*x;chk(x,mod);}return res;}
    ll GetPhi(ll n){ll ans=n;for(ll i=2;i*i<=n;i++){if(n%i==0){ans-=ans/i;while(n%i==0)n/=i;}}if(n>1)ans-=ans/n;return ans;}
    ll dfs(ll now,ll r,ll mod){
    	if(now==r+1||mod==1) return 1;
    	ll Mi=dfs(now+1,r,phi[mod]);
    	return QuickPow(a[now],Mi,mod);
    }
    signed main(){
    	read(n),read(m);
    	ll tmp=m;
    	while(tmp>1) phi[tmp]=GetPhi(tmp),tmp=phi[tmp];phi[1]=1;
    	for(int i=1;i<=n;i++) read(a[i]);
    	read(q);
    	while(q--){
    		ll l,r;
    		read(l),read(r);
    		write(dfs(l,r,m)%m),putchar('
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    各种筛法与莫比乌斯反演
    欧拉函数技巧与学习笔记
    莫比乌斯函数与欧拉函数的单个值的快速求法
    最短路算法总结
    NOI2018网络同步赛游记
    中国剩余定理及其扩展学习笔记
    构造方法的格式
    private关键字
    成员变量和局部变量的区别
    数据加密代码实现
  • 原文地址:https://www.cnblogs.com/Akmaey/p/15174893.html
Copyright © 2020-2023  润新知