hdu 5667

来源:互联网 发布:java.util.optional 编辑:程序博客网 时间:2024/06/18 05:22


输入样例
15 3 3 3 233
输出样例
190

发现f序列就是a的不同指数的形式,所以对每一个f对a取对数。发现就是f[n]=b+c*f[n-1]+f[n-2]。

构造矩阵,快速幂搞。

注意因为是在指数上,所以模的值需要是欧拉函数p,因为p是质数,所以直接是p-1。



代码如下:


#pragma warning(disable:4996)#include <iostream>#include <functional>#include <algorithm>#include <cstring>#include <vector>#include <string>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <deque>#include <set>#include <map>using namespace std;typedef long long ll;#define INF 0x333f3f3f#define repp(i, n, m) for (int i = n; i <= m; i++)#define rep(i, n, m) for (int i = n; i < m; i++)#define sa(n) scanf("%d", &(n))const ll mod = 100000007;const int maxn = 5e5 + 5;const double PI = acos(-1.0);ll n, a, b, c, p;struct ma{ll val[4][4];ma operator *(const ma &b){int i, j, k;ma res;memset(res.val, 0, sizeof(res.val));for (k = 1; k <= 3; k++){for (i = 1; i <= 3; i++){for (j = 1; j <= 3; j++){res.val[i][j] += (this->val[i][k] * b.val[k][j]) % (p - 1);res.val[i][j] %= (p - 1);}}}return res;}};ll po(ll x, ll y){ll res = 1;while (y){if (y & 1)res = res*x%p;x = x*x%p;y >>= 1;}return res;}ma po_matrix(ma &x, ll y){ma res;res.val[1][1] = 1, res.val[1][2] = 0, res.val[1][3] = 0;res.val[2][1] = 0, res.val[2][2] = 1, res.val[2][3] = 0;res.val[3][1] = 0, res.val[3][2] = 0, res.val[3][3] = 1;while (y){if (y & 1)res = res*x;x = x*x;y >>= 1;}return res;}void solve(){ll i, j, k;scanf("%lld%lld%lld%lld%lld", &n, &a, &b, &c, &p);ll res;ma r;if (n == 1){puts("1");}else if (n == 2){res = po(a, b);printf("%lld\n", res);}else{r.val[1][1] = c, r.val[1][2] = 1, r.val[1][3] = b;r.val[2][1] = 1, r.val[2][2] = 0, r.val[2][3] = 0;r.val[3][1] = 0, r.val[3][2] = 0, r.val[3][3] = 1;r = po_matrix(r, n - 2);res = r.val[1][3] + r.val[1][1] * b;res = po(a, res);printf("%lld\n", res);}}int main(){#ifndef ONLINE_JUDGE  freopen("i.txt", "r", stdin);freopen("o.txt", "w", stdout);#endifint t;scanf("%d", &t);while (t--){solve();}return 0;}


0 0