链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
本题测试样例已经更(jia)新(qiang)。
求f[n]=f[n-1]*f[n-2]*(a^b);
μ's在九人齐心协力下,影响力越来越大了!
已知第一天影响力为 ,第二天影响力为 ,从第三天开始,每一天的影响力为前两天影响力的乘积再乘以 的 次方。 用数学语言描述是:
设第 天的影响力为 ,那么 , ,对于 ,
她们想知道第 天影响力是多少?
由于这个数可能非常大,只需要输出其对 取模的值就可以了。
输入描述:
一行五个正整数: 。
输出描述:
第 天的影响力对 取模的值。
示例1
输入
复制4 2 3 2 1
4 2 3 2 1
输出
复制72
72
说明
f(1)=2,f(2)=3,f(3)=f(1)*f(2)*2=12,f(4)=f(2)*f(3)*2=72
备注:
1000000007是素数。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
const int mod=1e9+7;
const int mod1=1e9+6;
struct mat1{
ll a[2][2];
};
struct mat2{
ll a[3][3];
};
mat1 mul(mat1 a,mat1 b){
mat1 ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
ans.a[i][j]=(ans.a[i][j]+(a.a[i][k]*b.a[k][j])%mod1)%mod1;
}
}
}
return ans;
}
mat2 mul(mat2 a,mat2 b){
mat2 ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
ans.a[i][j]=(ans.a[i][j]+(a.a[i][k]*b.a[k][j])%mod1)%mod1;
}
}
}
return ans;
}
mat1 res1,ans1;
ll ksmmat(ll n){
memset(res1.a,0,sizeof(res1.a));
memset(ans1.a,0,sizeof(ans1.a));
ans1.a[0][0]=1;ans1.a[1][1]=1;
res1.a[0][0]=1;res1.a[0][1]=1;res1.a[1][0]=1;
while(n){
if(n&1){
ans1=mul(res1,ans1);
}
res1=mul(res1,res1);
n>>=1;
}
return ans1.a[0][0];
}
ll ksmmat1(ll n){
mat2 res,ans;
memset(res.a,0,sizeof(res.a));
memset(ans.a,0,sizeof(ans.a));
ans.a[0][0]=2;ans.a[1][0]=1;ans.a[2][0]=1;
res.a[0][0]=1;res.a[0][1]=1;res.a[0][2]=1;res.a[1][0]=1;res.a[2][2]=1;
while(n){
if(n&1){
ans=mul(res,ans);
}
res=mul(res,res);
n>>=1;
}
return ans.a[0][0];
}
ll ksm(ll a,ll b){
a%=mod;
ll ans=1;
while(b){
if(b&1)ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main(){
ll n,x,y,a,b;
cin>>n>>x>>y>>a>>b;
x%=mod;
y%=mod;
if(n==1){
cout<<x<<endl;
return 0;
}
else if(n==2){
cout<<y<<endl;
return 0;
}
else if(n==3){
ll tmp=(x*y)%mod;
cout<<tmp*ksm(a,b)%mod<<endl;
}
else{
ksmmat(n-3);
ll k1=ksm(x,ans1.a[1][0]+ans1.a[1][1]);
ll k2=ksm(y,ans1.a[0][0]+ans1.a[0][1]);
ll ans=(k1*k2)%mod;
ll ans1=ksmmat1(n-4);
ll cc=ksm(a,b);
cc=ksm(cc,ans1);
printf("%lld\n",((ans*cc))%mod);
}
return 0;
}