トピックへのリンク:私を突きます
\ [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;
}