E. Product Oriented Recurrence
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Let fx=c2x−6⋅fx−1⋅fx−2⋅fx−3fx=c2x−6⋅fx−1⋅fx−2⋅fx−3 for x≥4x≥4.
You have given integers nn, f1f1, f2f2, f3f3, and cc. Find fnmod(109+7)fnmod(109+7).
Input
The only line contains five integers nn, f1f1, f2f2, f3f3, and cc (4≤n≤10184≤n≤1018, 1≤f11≤f1, f2f2, f3f3, c≤109c≤109).
Output
Print fnmod(109+7)fnmod(109+7).
Examples
input
Copy
5 1 2 5 3
output
Copy
72900
input
Copy
17 97 41 37 11
output
Copy
317451037
Note
In the first example, f4=90f4=90, f5=72900f5=72900.
In the second example, f17≈2.28×1029587f17≈2.28×1029587.
分析:
我们可以将通项写成如下形式:
其中:
构造3维矩阵
得到F1,F2,F3。
将C[x]转化一下
构造矩阵
得到C。
然后欧拉降幂后直接计算即可。
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 5;
const int MOD = 1e9 + 6;
const int mod = 1e9 + 7;
using namespace std;
long long qk(long long a, long long n) {
long long ans = 1;
while (n) {
if (n & 1)ans = ans * a % mod;
n >>= 1;
a = a * a % mod;
}
return ans;
}
struct Matrix {
int n;
LL a[5][5];
Matrix(int n) : n(n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)a[i][j] = 0;
}
};
Matrix operator*(Matrix A, Matrix B) {
int n = A.n;
Matrix res(n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++) {
res.a[i][j] += (LL) A.a[i][k] * B.a[k][j] % MOD;
res.a[i][j] %= MOD;
}
return res;
}
Matrix operator^(Matrix A, long long b) {
int n = A.n;
Matrix res(n), base = A;
for (int i = 0; i < n; i++)res.a[i][i] = 1;
while (b) {
if (b & 1)res = res * base;
base = base * base;
b >>= 1;
}
return res;
}
Matrix a(3), b(5);
int main() {
long long n, f1, f2, f3, c;
cin >> n >> f1 >> f2 >> f3 >> c;
a.a[0][0] = 1;
a.a[0][1] = 1;
a.a[0][2] = 1;
a.a[1][0] = 1;
a.a[2][1] = 1;
b.a[0][0] = 1;
b.a[0][1] = 1;
b.a[0][2] = 1;
b.a[0][3] = 1;
b.a[1][0] = 1;
b.a[2][1] = 1;
b.a[3][3] = 1;
b.a[3][4] = 1;
b.a[4][4] = 1;
a = a ^ (n - 3);
b = b ^ (n - 3);
long long ans = 1;
long long F1 = (a.a[0][2] ) % MOD;
long long F2 = ( a.a[0][1] ) % MOD;
long long F3 = (a.a[0][0] ) % MOD;
ans = qk(f1, F1) * qk(f2, F2) % mod * qk(f3, F3) % mod;
long long C = (b.a[0][3]*2 + b.a[0][4] * 2) % MOD;
ans = ans * qk(c, C) % mod;
cout << ans << endl;
}