链接:https://ac.nowcoder.com/acm/contest/10507/A
来源:牛客网
题目描述
广义肥波那契数列,以递归的方法定义如下:
例如,当a=b=\text 1a=b=1时,数列为[\text 1,1,2,3,5,8,13,…][1,1,2,3,5,8,13,…]。
现在,请求出。
输入描述:
输入共一行,包含4个正整数a,b,m,n(1<= a,b,m<=10^9,1<= n <=10^5)。
输出描述:
输出共一行,包含一个非负整数表示答案。由于结果可能较大,你只需要输出答案对10^9+7=1,000,000,007取模的结果。
示例1
输入
1 1 2 4
输出
8
说明
正确代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
long long dp[100100];
long long MOD=1000000007;
long long suan(long long a,long long n){
long long re = 1;
while(n)
{
if(n & 1)//判断n的最后一位是否为1
re = (re * a) % MOD;
n >>= 1;//舍去n的最后一位
a = (a * a) % MOD;//将a平方
}
return re;
}
int main(){
int a,b,m,n;
while(cin>>a>>b>>m>>n){
long long dp[n+5];
dp[2]=1;
dp[1]=1;
for(int i=3;i<=n;i++){
dp[i]=(a*dp[i-1]%(MOD-1)+b*dp[i-2]%(MOD-1))%(MOD-1);
}
long long k=suan(m,dp[n]);
cout<<k<<endl;
}
return 0;
}