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.f​n​​=​⎩​⎨​⎧​​​1,​a​b​​,​a​b​​f​n−1​c​​f​n−2​​,​​​n=1​n=2​otherwise​​

\ \ \ \    他给了你几个数:nn,aa,bb,cc,你须要告诉他f_nf​n​​模pp后的数值.
输入描写叙述
\ \ \ \    第一行一个数T,为測试数据组数.

\ \ \ \    每组数据一行,一行五个正整数,按顺序为nn,aa,bb,cc,pp.

\ \ \ \ 1\le T \le 10,1\le n\le 10^{18}    1≤T≤10,1≤n≤10​18​​,1\le a,b,c\le 10^91≤a,b,c≤10​9​​,p是质数且p\le 10^9+7p≤10​9​​+7.
输出描写叙述
\ \ \ \    对每组数据输出一行一个数,输出f_nf​n​​对pp取模后的数值.
输入例子
1
5 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);
#endif int t;
scanf("%d", &t); while (t--)
{
solve();
} return 0;
}

HDU 5667 :Sequence的更多相关文章

  1. HDU 5312:Sequence

    Sequence  Accepts: 25  Submissions: 1442  Time Limit: 2000/2000 MS (Java/Others)  Memory Limit: 2621 ...

  2. HDU - 6395:Sequence (分块+矩阵)

    题面太丑了,就不复制了. 题意:F1=A: F2=B: Fn=D*Fn-1+C*Fn-2+P/i:求Fn. 思路:根据P/i的值划分区间,每个区间矩阵求. 带常数的矩阵: #include<bi ...

  3. HDU 5860 Death Sequence(死亡序列)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  4. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  5. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

  6. hdu 5667 BestCoder Round #80 矩阵快速幂

    Sequence  Accepts: 59  Submissions: 650  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

  7. HDU 1005 Number Sequence(数论)

    HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...

  8. HDU 6078 - Wavel Sequence | 2017 Multi-University Training Contest 4

    /* HDU 6078 - Wavel Sequence [ DP ] | 2017 Multi-University Training Contest 4 题意: 给定 a[N], b[M] 要求满 ...

  9. HDU 6047 - Maximum Sequence | 2017 Multi-University Training Contest 2

    /* HDU 6047 - Maximum Sequence [ 单调队列 ] 题意: 起初给出n个元素的数列 A[N], B[N] 对于 A[]的第N+K个元素,从B[N]中找出一个元素B[i],在 ...

随机推荐

  1. [密钥权限过大错误]ssh “permissions are too open” error

    I had a problem with my mac where I couldn't save any kind of file on the disk anymore. I had to reb ...

  2. [转]zsh快捷键记录

    转自: http://wdxtub.com/2016/02/18/oh-my-zsh/ 使用技巧 连按两次Tab会列出所有的补全列表并直接开始选择,补全项可以使用 ctrl+n/p/f/b上下左右切换 ...

  3. xampp下bugfree部署

    以Bugfree3.0.4为例,讲解如何搭建LAMP架构的Web服务器. Bugfree是一个XAMPP架构的网站,XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的搭建XAMP ...

  4. java面试题之哨兵如何判断主服务器是否下线?

    通过流言协议来接收关于主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器.

  5. COGS728. [网络流24题] 最小路径覆盖问题

    算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E).设P是G的一个简单路(顶点不相交)的集合.如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖.P中 ...

  6. 前端居中模板(常用HTML模板)

    0.效果:

  7. CI安全

    URI安全,CodeIgniter 严格限制 URI 中所能包含的字符,以此帮助你设计的程序减少被恶意数据入侵的可能.URI 一般只包含下列内容: 字母和数字(Alpha-numeric text) ...

  8. lunix cat tail more等用法

    cat主要有三大功能:  1.一次显示整个文件.  $ cat filename  2.从键盘创建一个文件.  $ cat > filename  只能创建新文件,不能编辑已有文件.  3.将几 ...

  9. Day 19 函数之闭包、装饰器

    一.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰 ...

  10. UVA - 10615 Rooks

    建一下模,把行和列看成二分图的点,把车看成是二分图中的边,这样就变成了上一个博客的问题. 我们每次新加一条边,就把它加入一条 这条边两端点最小没有出现的颜色  交替出现的路径中去. #include& ...