P9816 少项式复合幂

发布时间 2023-10-29 19:36:31作者: int_R

P9816 少项式复合幂

给定多项式 \(f(x)=\sum_{i=1}^ma_ix^{b_i}\)。定义 \(f_1(x)=f(x)\)\(f_n(x)=f(f_{n-1}(x))\)

就是初始将 \(x\) 代入多项式,再将结果代入,总共代入 \(y\) 次。

根据提示发现模数 \(p\)\(10^5\) 级别的,于是对于 \(x\in[0,p-1]\) 暴力计算出 \(f(x)\bmod p\) 的值。然后既然知道了每个 \(x\) 带入一次的值,之后倍增处理一下即可。时间复杂度 \(O(mp\log p+(p+q)\log y)\)

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1e5+10;
int m,q,p,a[25],b[25],f[MAXN][25];
inline long long ksm(long long a,int b)
{
    long long ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%p;
        a=a*a%p,b>>=1;
    }
    return ans;
}
int main()
{
#ifdef ONLINE_JUDGE
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
#endif
    cin>>m>>q>>p;
    for(int i=1;i<=m;++i) cin>>a[i]>>b[i];
    for(int x=0;x<p;++x)
    {
        long long sum=0;
        for(int i=1;i<=m;++i)
            sum+=ksm(x,b[i])*a[i]%p;
        f[x][0]=sum%p;
    }
    for(int j=1;j<25;++j)
        for(int i=0;i<p;++i)
            f[i][j]=f[f[i][j-1]][j-1];
    while(q--)
    {
        int x,y;cin>>x>>y;x%=p;
        for(int j=24;j>=0;--j)
            if(y&(1<<j)) x=f[x][j];
        cout<<x<<'\n';
    }
    return 0;
}