Educational Codeforces Round 13 D. Iterated Linear Function 水题

D. Iterated Linear Function

题目连接:

http://www.codeforces.com/contest/678/problem/D

Description

Consider a linear function f(x) = Ax + B. Let's define g(0)(x) = x and g(n)(x) = f(g(n - 1)(x)) for n > 0. For the given integer values A, B, n and x find the value of g(n)(x) modulo 109 + 7.

Input

The only line contains four integers A, B, n and x (1 ≤ A, B, x ≤ 109, 1 ≤ n ≤ 1018) — the parameters from the problem statement.

Note that the given value n can be too large, so you should use 64-bit integer type to store it. In C++ you can use the long long integer type and in Java you can use long integer type.

Output

Print the only integer s — the value g(n)(x) modulo 109 + 7.

Sample Input

3 4 1 1

Sample Output

7

Hint

题意

g(0)(x) = x

g(n)(x)=f(g(n-1)(x))

f(x) = ax+b

给你a b n x

求g(n)(x)

题解:

推一下 发现 g(n)(x) = anx+a(n-1)b+a^(n-2)b+...+ab+b

其实就是等比数列……

快速幂直接莽一波就好了

特判 a=1的时候

代码

include<bits/stdc++.h>

using namespace std;
const long long mod = 1e9+7;
long long quickpow(long long m,long long n,long long k)//返回m^n%k
{
long long b = 1;
while (n > 0)
{
if (n & 1)
b = (bm)%k;
n = n >> 1 ;
m = (m
m)%k;
}
return b;
}

int main()
{
long long a,b,n,x;
cin>>a>>b>>n>>x;
if(a==1)
{
cout<<(n%modb+x)%mod<<endl;
return 0;
}
long long ans=(quickpow(a,n,mod)-1+mod)%mod;
ans=ans
quickpow(a-1,mod-2,mod)%modb%mod;
ans=(ans+quickpow(a,n,mod)
x+mod)%mod;
printf("%lld\n",ans%mod);
}

posted @ 2016-06-14 08:40  qscqesze  阅读(472)  评论(0)    收藏  举报