【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone

Well, Lost use Ipad and IPhone to reward the ones who solve the following problem.

In this problem, we define F( n ) as :

Then Lost denote a function G(a,b,n,p) as

Here a, b, n, p are all positive integer!
If you could tell Lost the value of G(a,b,n,p) , then you will get one Ipad and one IPhone!
Then for every case, only one line containing 4 positive integers a, b, n and p.
(1 ≤a, b, n, p≤2*109 , p is an odd prime number and a,b < p.)
2 3 1 10007
2 3 2 10007
2 3 3 10007
2 3 4 10007
392
3880
9941
/*
五代李煜
《相见欢·林花谢了春红》
林花谢了春红,太匆匆。无奈朝来寒雨晚来风。
胭脂泪,相留醉,几时重。自是人生长恨水长东。
*/
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <vector>
#define LOCAL
const int MAXN = + ;
const int INF = 0x7fffffff;
using namespace std;
typedef long long ll;
ll mod;//代表取模的数字
ll check, a, b, n, p;
struct Matrix{
ll num[][];
//Matrix(){memset(num, 0, sizeof(num));}
};
//为了防止和第一种矩阵乘法搞混
Matrix Mod(Matrix A, Matrix B, ll k){
if (k == ){//代表两种不同的乘法
Matrix c;
memset(c.num, , sizeof (c.num));
for (ll i = ; i <= ; i++)
for (ll j = ; j <= ; j++)
for (ll k = ; k <= ; k++){
ll tmp = (A.num[i][k] * B.num[k][j]);
if (check) tmp %= (p - );
c.num[i][j] += tmp;
if (check) c.num[i][j] %= (p - );
}
//一旦大于了p-1代表当前出现的斐波那契数列会大于phi(p),可以使用降幂大法
if ((c.num[][] + c.num[][]) > (p - )) check = ;
return c;
}else if (k == ){
Matrix C;
memset(C.num, , sizeof(C.num));
for (ll i = ; i <= ; i++)
for (ll j = ; j <= ; j++)
for (ll k = ; k <= ; k++) {
C.num[i][j] += (A.num[i][k] * B.num[k][j]) % p;
C.num[i][j] = ((C.num[i][j] % p) + p) % p;
}
return C;
}
}
//得到第x位的斐波那契数,也就是获得指数
Matrix Matrix_pow(Matrix A, ll x, ll k){
if (x == ) return A;
Matrix tmp = Matrix_pow(A, x / , k);
if (x % == ) return Mod(tmp, tmp, k);
else return Mod(Mod(tmp, tmp, k), A, k);
}
ll get(ll x){
if (x == ) return ;
else if (x == ) return ;
Matrix A, B;
A.num[][] = ; A.num[][] = ;
A.num[][] = ; A.num[][] = ;
x--;//为真实的需要乘的次数
if (x == ) return ;
B = Matrix_pow(A, x, );
if (B.num[][] + B.num[][] > (p - )) check = ;
if (check == ) return B.num[][] + B.num[][];
else return (B.num[][] + B.num[][]) % (p - ) + p - ;
}
//有了a,b,pos就可进行矩阵加速了
ll cal(ll a, ll b, ll pos){
if (pos == ) return % p;
else if (pos == ) return ( * (a + b)) % p;
Matrix A;
A.num[][] = ( * (a + b)) % p; A.num[][] = (((-(a - b) * (a - b)) % p) + p) % p;
A.num[][] = ; A.num[][] = ;
pos--;
Matrix B;
B = Matrix_pow(A, pos, );
return (B.num[][] * A.num[][]) % p + (B.num[][] * ) % p;
}
ll pow(ll a, ll b){
if (b == ) return % p;
if (b == ) return a % p;
ll tmp = pow(a, b / );
if (b % == ) return (tmp * tmp) % p;
else return (((tmp * tmp) % p) * a) % p;
} int main(){
int T;
scanf("%d", &T);
while (T--){
//for (int i = 1; i ,=)
scanf("%lld%lld%lld%lld", &a, &b, &n, &p);
check = ;//判断f(n)是否大于p
ll pos = get(n);
ll Ans = cal(a, b, pos);
ll f1, f2;
f1 = (pow(a, (p - ) / ) + ) % p;
f2 = (pow(b, (p - ) / ) + ) % p;
Ans = (((f1 * f2) % p) * Ans) % p;
printf("%lld\n", Ans);
}
//p = 0x7fffffff;
//printf("%lld", get(5));
//for (int i = 0; i <= 10; i++) printf("%lld\n", get(i));
return ;
}
【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone的更多相关文章
- Ipad,IPhone(矩阵求递推项+欧拉定理)
Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5564 Clarke and digits 状压dp+矩阵加速
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...
- 【BZOJ3884】【降幂大法】上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元” ...
- 【 CodeForces - 392C】 Yet Another Number Sequence (二项式展开+矩阵加速)
Yet Another Number Sequence Description Everyone knows what the Fibonacci sequence is. This sequence ...
- 【HDU 3483】 A Very Simple Problem (二项式展开+矩阵加速)
A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- C++矩阵加速经典题目:Warcraft III 守望者的烦恼 [vijos 1067]
Warcraft III 守望者的烦恼 背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫"闪烁", ...
- LuoGu P1939 【模板】矩阵加速(数列)
板子传送门 矩阵快速幂学完当然要去搞一搞矩阵加速啦 (矩阵加速相对于矩阵快速幂来说就是多了一个构造矩阵的过程) 关于怎样来构造矩阵,这位大佬讲的很好呢 构造出矩阵之后,我们再去用矩阵快速幂乘出来,取[ ...
- Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)
补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...
- P1939【模板】矩阵加速(数列)
P1939[模板]矩阵加速(数列)难受就难受在a[i-3],这样的话让k=3就好了. #include<iostream> #include<cstdio> #include& ...
随机推荐
- MHz 和 Mbps的区别
Hz是频率单位,例如10Hz就是表示每秒运算10次 Mbps是Million bit per secend (表示每秒传输的兆位数)=Mb/s MHz 和 Mbps 并不是同一个单位,关键是看bus的 ...
- java对Ldap操作2
package ldap.pojo;import java.util.List;/** * @author 张亮 * ldap用户属性信息数据类 */public class LdapPersonI ...
- Magic Pairs - SGU 119(同余)
题目大意:如果A0*X + B0*Y能够整除 N,求出来多有少A*X+B*Y 也能够整除去N,求出所有的A,B(0<=A,B<N) 分析:有条件可以知道 A*X+B*Y = K *(A0* ...
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- svn操作
1.已经被svn管理的文件的复制.删除.重命名都要通过svn的命令来操作(在资源管理器中通过鼠标右键来完成)(复制粘贴可以通过右键按下移动来实现) 2.没有被svn管理的文件(没有被上传过的文件,没有 ...
- C基础
一.关于整型数据 1.整型常量:十进制数前面可以加+.-号,但是不能有前缀0 八进制数:必须以前缀0开头,不是O.不能加负号(-),否则不能识别. 十六进制数:前缀必须为0x或者0X.不能加负号(-) ...
- JS时钟钟表
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(7)-MVC与EasyUI DataGrid
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(7)-MVC与EasyUI DataGrid 没有源码的同学跳到第六讲下载源码再来. 我们需要漂亮的UI, ...
- Boost.Asio c++ 网络编程翻译(20)
异步服务端 这个图表是相当复杂的:从Boost.Asio出来你能够看到4个箭头指向on_accept.on_read,on_write和on_check_ping. 着也就意味着你永远不知道哪个异步调 ...
- TCP/IP(84) 详解
http://blog.csdn.net/zhangskd/article/category/873810