NOI2013マトリックスゲーム

トピックへのリンク:私を突きます

\ [F [n]は、[m]は* F [Nを=] [M-1] + B \]
\ [= A ^ {M-1} * F [N] [1] + B + AB + ... + A ^ {M-2} \] B
\ [= A ^ {M-1} *(C *とのF [I-1] [M] + D)+ B + AB + ... + A ^ {M- 2} B \]
\ [= A ^ {M-1} * C *とのF [I-1] [M] + A ^ {M-1} * D + B + AB + ... + A ^ {M- 2} Bの\]

セット\(^ {M-1 } * C \) の\(X \)
\(AB&+ B + ... + A ^ B {M-2} \)\(P \)が
配置され、\を(^ {M-1} * D + P \) の\(Y \)が
設けられている\(Y + XY + ... + X ^ {N-2}のY \)はQであります

セット\(N、Mの\)される(MOD-1 \)\周波数用語モジュロ(N - 1 \)\\(M-1 \)が
配置され、\は(NN、MM \)される(MODを\します\)各項の係数モジュロ\(1-N- \) \(1-Mの\)

\ [\ [M] =(X ^ N)(A ^ M)+ Q [n]はF]

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 100010
#define MOD 1000000007
using namespace std;
int n,m,a,b,c,d,nn,mm;
long long p,q,x,y;
inline int fpow(int x,int y,int mod)
{
    int cur_ans=1;
    while(y)
    {
    if(y&1) cur_ans=1ll*x*cur_ans%mod;
    x=1ll*x*x%mod;
    y>>=1;
    }
    return cur_ans%mod;
}
inline int inv(int x){return fpow(x,MOD-2,MOD);}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    int f=1;
    char ch;
    while(ch<'0'||ch>'9'){if(ch==-1)f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')
    {
        n=(10ll*n+ch-'0')%(MOD-1);
        nn=(10ll*nn+ch-'0')%MOD;
        ch=getchar();
    }
    n=(n+MOD-2)%(MOD-1);//次数n-1
    nn=(nn+MOD-1)%MOD;//系数n-1
    while(ch<'0'||ch>'9'){if(ch==-1)f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')
    {
        m=(10ll*m+ch-'0')%(MOD-1);
        mm=(10ll*mm+ch-'0')%MOD;
        ch=getchar();
    }
    m=(m+MOD-2)%(MOD-1);//次数m-1
    mm=(mm+MOD-1)%MOD;//系数m-1
    scanf("%d%d%d%d",&a,&b,&c,&d);
    int am=fpow(a,m,MOD);
    x=1ll*am*c%MOD;
    if(a==1) p=1ll*b*mm%MOD;
    else p=1ll*b*(1+MOD-am)%MOD*inv(1+MOD-a)%MOD;
    int xn=fpow(x,n,MOD);
    y=(1ll*am*d%MOD+p)%MOD;
    if(x==1) q=1ll*y*nn%MOD;
    else q=1ll*y*(1+MOD-xn)%MOD*inv(1+MOD-x)%MOD;
    printf("%lld\n",(1ll*xn*(am+p)+q)%MOD);
    return 0;
}

おすすめ

転載: www.cnblogs.com/fengxunling/p/10947461.html