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. 山东理工大学第七届ACM校赛-G 飞花的传送门

    G - 飞花的传送门 飞花壕最近手头比较宽裕,所以想买两个传送门来代步(夏天太热,实在是懒得走路).平面上有N个传送门,飞花壕想要挑两个距离最远的传送门带回家(距离为欧几里得距离,即两点之间直线距离) ...

  2. 使用runtime关联对象将视图添加到视图的类目里

    //get方法 - (RJCircularLoaderView*)rj_circularLoaderView { RJCircularLoaderView *loaderView = objc_get ...

  3. kb-07专题线段树-02--单点修改,区间最值

    /* 区间单点该值,区间查询最大值: hdu-1754 */ #include<iostream> #include<cstdio> #include<cstring&g ...

  4. 刷题总结——棘手的操作(bzoj2333)

    题目: 题目背景 SCOI2011 DAY2 T1 题目描述 有 N 个节点,标号从 1 到 N ,这 N 个节点一开始相互不连通.第i个节点的初始权值为 a[i] ,接下来有如下一些操作:U x y ...

  5. Jersey实现Client端:GET/PUT/POST/DELETE

    原文地址:Jersey客户端API调用REST风格的Web服务 [节选] 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Clien ...

  6. 你所在的公司是如何实施DEVOPS的?

    工欲善其事,必先利其器,现在大家在DevOps领域最关注的还是在工具层面.下面是我跟这么多公司接触下来,大家使用比较多的工具:1.监控工具比较老牌的就是Zabbix,Nagios,用Zabbix的感觉 ...

  7. Enable and Use Remote Commands in Windows PowerShell

    The Windows PowerShell remoting features are supported by the WS-Management protocol and the Windows ...

  8. scroll与按钮的位置

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Java 经典笔试题

    这些题目对我的笔试帮助很大,有需要的朋友都可以来看看,在笔试中能遇到的题目基本上下面都会出现,虽然形式不同,当考察的基本的知识点还是相同的. 在分析中肯定有不足和谬误的地方还请大虾们能够给予及时的纠正 ...

  10. T1155 金明的预算方案 codevs

    累~~~  http://codevs.cn/problem/1155/ 题目描述 Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高 ...