zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    礼物的最大价值
    复杂链表的复制
    全排列(回溯法)
    删除排序数组中的重复项
    三角形最小路径和(经典dp)
    链表中倒数第k个节点
    造成segment fault,产生core dump的可能原因
    wmpnetwk.exe怎么禁启动
    GSM/GPRS/EDGE/WCDMA/HSDPA/HSUPA--辨析
    OSI七层参考模型每一层都有哪些协议
  • 原文地址:https://www.cnblogs.com/Akmaey/p/15174893.html
Copyright © 2011-2022 走看看