zoukankan      html  css  js  c++  java
  • 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 top, which is built from k - 1 rocks, possesses power p and we want to add the rock charged with power wk then value of power of a new tower will be {wk}p.

    Rocks are added from the last to the first. That is for sequence w1, ..., wm value of power will be

    After tower is built, its power may be extremely large. But still priests want to get some information about it, namely they want to know a number called cumulative power which is the true value of power taken modulo m. Priests have n rocks numbered from 1 to n. They ask you to calculate which value of cumulative power will the tower possess if they will build it from rocks numbered l, l + 1, ..., r.

    Input

    First line of input contains two integers n (1 ≤ n ≤ 105) and m (1 ≤ m ≤ 109).

    Second line of input contains n integers wk (1 ≤ wk ≤ 109) which is the power of rocks that priests have.

    Third line of input contains single integer q (1 ≤ q ≤ 105) which is amount of queries from priests to you.

    kth of next q lines contains two integers lk and rk (1 ≤ lk ≤ rk ≤ n).

    Output

    Output q integers. k-th of them must be the amount of cumulative power the tower will have if is built from rocks lk, lk + 1, ..., rk.

    Example
    Input
    6 1000000000
    1 2 2 3 3 3
    8
    1 1
    1 6
    2 2
    2 3
    2 4
    4 4
    4 5
    4 6
    
    Output
    1
    1
    2
    4
    256
    3
    27
    597484987
    
    Note

    327 = 7625597484987

    题意:给出一个数字序列和一个固定的模数mod,给出q个询问,每次询问f(l,r)

    f(l,r) =a[l]^(a[l+1]^(a[l+2]^(a[l+3]^(...^a[r])))%mod (^是幂次的意思)

    题解:扩展欧拉定理告诉我们

    然后我们尝试展开a^b^c

    再往下也是一样的,我们可以先预处理出phi[p],phi[phi[p]]……

    大概要处理几层呢?logn层,为什么呢?

    假设phi[now]=1了

    那么之上不管多少层

    x=1,2,3,4,5……

    这些数模一都是一

    所以就成了欧拉函数的衰变速度(我瞎糊的名词,意思是经过几次phi,p会变成1)

    这个复杂度是logn的,我们可以对这进行一发dfs,加上快速幂的logn复杂度,总复杂度是loglogn的,值得一提的是,快速幂中也要改成扩展欧拉定理的形式,否则小心炸掉~

    顺便可以研究一下这道题是怎么被博主伪装成线段树的

    U23882 天真♂哲学家♂树(Naive Philosopher Tree)

    代码如下:

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int a[100010],phi[100],n,m,mod;
    
    int get(int x)
    {
        int ans=x;
        for(int i=2;i*i<=x;i++)
        {
            if(x%i==0)
            {
                ans=ans/i*(i-1);
                while(x%i==0)
                {
                    x/=i;
                }
            }
        }
        if(x!=1)
        {
            ans=ans/x*(x-1);
        }
        return ans;
    }
    
    int gg(long long x,int p)
    {
        return x>=p?x%p+p:x;
    }
    
    int kasumi(int a,int b,int p)
    {
        int ans=1;
        while(b)
        {
            if(b&1)
            {
                ans=gg(1ll*ans*a,p);
            }
            a=gg(1ll*a*a,p);
            b>>=1;
        }
        return ans;
    }
    
    int dfs(int l,int r,int i)
    {
        if(l==r||phi[i]==1)
        {
            return gg(a[l],phi[i]);
        }
        return kasumi(a[l],dfs(l+1,r,i+1),phi[i]);
    }
    
    int main()
    {
        scanf("%d%d",&n,&mod);
        phi[0]=mod;
        for(int i=1;i<=30;i++)
        {
            phi[i]=get(phi[i-1]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%d
    ",dfs(l,r,0)%mod);
        }
        return 0;
    }
  • 相关阅读:
    过桥问题
    修改state中数组对象某一个字段(state中某个属性为对象或数组时,需要修改该对象中的某一个属性)
    git 如何提交,新建, 拉取远程分支,git基本操作,git新手教学
    el-image组件大图预览不能定位当前图片的处理
    vue数组遍历动态渲染到页面
    vue路由传参的三基本方式
    git push时报错:error: failed to push some refs to/hint: Updates were rejected because the tip of your current branch is behind/hint: its remote counterpart. Integrate the remote changes
    时间格式转换/时间戳的转换
    Day.js :一个轻量的处理时间和日期的 JavaScript 库
    node多版本管理(node版本切换、node版本更新及降低版本)
  • 原文地址:https://www.cnblogs.com/stxy-ferryman/p/8886221.html
Copyright © 2011-2022 走看看