2020牛客寒假算法基础集训营1 u's的影响力

题意

  设第 i 天的影响力为  ,那么  ,,对于  , 

  她们想知道第  天影响力是多少?
  由于这个数可能非常大,只需要输出其对  取模的值就可以了。

题解

  费马小定理 + 矩阵快速幂。

代码

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
struct matrix
{
    long long M[3][3];
    matrix operator * (const matrix & other) const
    {
        matrix ans;
        fill(ans.M[0],ans.M[0]+9,0);
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                for(int k=0;k<3;k++)
                    ans.M[i][j]=(ans.M[i][j]+M[i][k]*other.M[k][j]%(mod-1))%(mod-1);
        return ans;
    }
};
matrix quick(matrix a,long long b);
long long quick(long long a,long long b);
long long n,x,y,a,b;
int main()
{
    long long ans,p,q;

    scanf("%lld%lld%lld%lld%lld",&n,&x,&y,&a,&b);
    a%=mod;x%=mod;y%=mod;b%=mod-1;

    matrix mat,pre={1,1,b,1,0,0,0,0,1};
    
    if(n==1) printf("%lld",x);
    else if(n==2) printf("%lld",y);
    else
    {
        if(a==0||x==0||y==0) 
            printf("0\n");
        else
        {
            mat=quick(pre,n-2);
            ans=((quick(x,mat.M[0][1])%mod*quick(y,mat.M[0][0])%mod)%mod*quick(a,mat.M[0][2])%mod)%mod;
            printf("%lld",ans);
        }
    }
    system("pause");
    return 0;
}
matrix quick(matrix a,long long b)
{
    matrix ans;
    fill(ans.M[0],ans.M[0]+9,0);
    ans.M[0][0]=ans.M[1][1]=ans.M[2][2]=1;
    while(b)
    {
        if(b&1)
            ans=ans*a;
        b/=2;
        a=a*a;
    }
    return ans;
}
long long quick(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        b/=2;
        a=(a*a)%mod;
    }
    return ans;
}
posted @ 2020-02-18 14:21  Vivid-BinGo  阅读(171)  评论(0编辑  收藏  举报