51nod1341 混合序列

题目
矩阵快速幂做法

题解:

这题真的很麻烦,有多种情况要讨论
公式不会编辑,将就着看一下吧
我的sigma如果上下界没注明,那就默认是1和n的
1
代码有点烦,还是不要看的好,最多拿来对拍一下
注意:ex_gcd中a,b不能是负数,要处理一下

#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
typedef long long ll;
ll p,q,r,n,P,Q,tmp,k,K,y,t,T,ans;
void ex_gcd(ll a,ll b,ll &x,ll &y){
    if (a<0) a=(a%M+M)%M;
    if (b<0) b=(b%M+M)%M;
    if (!b){
        x=1;y=0;
        return;
    }
    ex_gcd(b,a%b,y,x);
    y-=a/b*x;
}
ll pm(ll x,ll y){
    ll z=1;
    for (;y;y>>=1,x=x*x%M)
        if (y&1) z=z*x%M;
    return z;
}
int main(){
    scanf("%lld%lld%lld%lld",&p,&q,&r,&n);
    if (p==1){
        if (q==1) ans=n*(n+1)/2%M*3*r%M;
        else{
            ex_gcd(q,M,Q,y);
            T=n*Q%M;
            ex_gcd(q-1,M,Q,y);
            k=pm(q,n)-1;
            if (k<0) k+=M;
            k=k*Q%M;
            k=(k-T)%M;
            ans=k*q%M*Q%M*3*r%M;
        }
    }else{
        if (p==q) t=n+1;
        else{
            ex_gcd(q,M,Q,y);
            tmp=pm(p*Q%M,n+1)-1;
            if (tmp<0) tmp+=M;
            k=(p*Q-1)%M;
            ex_gcd(k,M,K,y);
            t=tmp*K%M;
        }
        t=t*pm(q,n)%M;
        if (q==1) k=n+1;
        else{
            k=q-1;
            ex_gcd(k,M,K,y);
            T=pm(q,n+1)-1;
            if (T<0) T+=M;
            k=T*K%M;
        }
        t=(t-k)%M;
        ex_gcd(p-1,M,P,y);
        ans=3*r*P%M*t%M;
    }
    printf("%lld",(ans+M)%M);
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80724709
今日推荐