HDU 5667:Sequence

来源:互联网 发布:淘宝怎么退货 编辑:程序博客网 时间:2024/06/06 04:53

Sequence

 
 Accepts: 59
 
 Submissions: 650
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
\ \ \ \    Lcomyn 是个很厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到了一个数列:f_n=\left\{\begin{matrix} 1 ,&n=1 \\ a^b,&n=2 \\ a^bf_{n-1}^cf_{n-2},&otherwise \end{matrix}\right.fn=1,ab,abfn1cfn2,n=1n=2otherwise\ \ \ \    他给了你几个数:nn,aa,bb,cc,你需要告诉他f_nfnpp后的数值.
输入描述
\ \ \ \    第一行一个数T,为测试数据组数.\ \ \ \    每组数据一行,一行五个正整数,按顺序为nn,aa,bb,cc,pp.\ \ \ \ 1\le T \le 10,1\le n\le 10^{18}    1T10,1n1018,1\le a,b,c\le 10^91a,b,c109,p是质数且p\le 10^9+7p109+7.
输出描述
\ \ \ \    对每组数据输出一行一个数,输出f_nfnpp取模后的数值.
输入样例
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