题意:

,其中,给出n,y,x,s,求

思路:

有递推式:

因此可以构造矩阵:

但是这个结果是放在指数上的,这里就要用到欧拉降幂公式了。

还有另一种写法:可以推出

这里除以2不能直接用逆元处理,因为并没有保证2和s+1互质,所以可以用到公式(b和c不一定要互质)。

还有其他公式

代码:

struct mat
{
    long long a[4][4];
}m,r;
ll MOD;
ll euler(ll n)
{
    ll i,res=n;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            res=res/i*(i-1);
            while(n%i==0)
                n=n/i;
        }
    }
    if(n>1)res=res/n*(n-1);
    return res;
}
mat mult(mat x,mat y)
{
    mat res={0};
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                res.a[i][j]=(res.a[i][j]+(x.a[i][k]*y.a[k][j])%MOD)%MOD;
    return res;
}
mat PowerMod(mat x,ll n)
{
    mat ans={0};
    for(int i=0;i<4;i++)
        ans.a[i][i]=1;
    while(n>0)
    {
        if(n%2==1)
            ans=mult(ans,x);
        x=mult(x,x);
        n=n/2;
    }
    return ans;
}
long long powermod(long long a,long long b,long long c)
{
    long long ans=1;
    long long k;
    k=a;
    k=k%c;
    while(b>0)
    {
        if(b&1)
            ans=(ans*k)%c;
        b>>=1;
        k=(k*k)%c;
    }
    return ans;
}
int main()
{
    int t;
    ll n,y,x,s;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld",&n,&y,&x,&s);
        MOD=euler(s+1);
        m.a[0][0]=4;m.a[0][1]=1;m.a[0][2]=4;m.a[0][3]=0;
        m.a[1][0]=1;m.a[1][1]=0;m.a[1][2]=0;m.a[1][3]=0;
        m.a[2][0]=2;m.a[2][1]=0;m.a[2][2]=1;m.a[2][3]=0;
        m.a[3][0]=4;m.a[3][1]=1;m.a[3][2]=4;m.a[3][3]=1;
        r=PowerMod(m,n*y-1);
        ll temp=(r.a[3][0]+r.a[3][3])%MOD+MOD;
        printf("%lld\n",powermod(x,temp,s+1));
    }
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

ZOJ3715 枚举+贪心 Previous
调试用 Next