HDU 4565 So Easy! 矩阵快速幂
题意:
求\(S_n=\left \lceil (a+\sqrt{b})^n \right \rceil mod \, m\)的值。
分析:
设\((a+\sqrt{b})^n=A_n+B_n \sqrt{b}\),
\((a+\sqrt{b})^{n+1}=(a+\sqrt{b})(A_n+B_n \sqrt{b})=(aB_n+A_n)+(A_n+aB_n) \sqrt{b}\),
所以有转移矩阵:
$\begin{bmatrix}
a & b \
1 & a
\end{bmatrix}
\begin{bmatrix}
A_n\
B_n
\end{bmatrix}
\begin{bmatrix}
A_{n+1}\
B_{n+1}
\end{bmatrix}$
如果把\(\sqrt{b}\)变为\(-\sqrt{b}\),就得到\((a- \sqrt{b})^n=A_n-B_n \sqrt{b}\)。
两式相加:\((a+\sqrt{b})^n+(a-\sqrt{b})^n=2A_n\)。
再由题中所给条件知道,\(a-\sqrt{b}\)是个小于\(1\)的数,所以\(\left \lceil (a+\sqrt{b})^n \right \rceil=2A_n\)。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a, b, n, m;
int mul(int a, int b) { return a * b % m; }
void add(int& a, int b) { a += b; if(a >= m) a -= m; }
struct Matrix
{
int a[2][2];
Matrix() { memset(a, 0, sizeof(a)); }
Matrix operator * (const Matrix& t) const {
Matrix ans;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
add(ans.a[i][j], mul(a[i][k], t.a[k][j]));
return ans;
}
};
Matrix pow_mod(Matrix a, int p) {
Matrix ans;
for(int i = 0; i < 2; i++) ans.a[i][i] = 1;
while(p) {
if(p & 1) ans = ans * a;
a = a * a;
p >>= 1;
}
return ans;
}
int main()
{
while(scanf("%d%d%d%d", &a, &b, &n, &m) == 4) {
a %= m; b %= m;
Matrix M;
M.a[0][0] = a; M.a[0][1] = b;
M.a[1][0] = 1; M.a[1][1] = a;
M = pow_mod(M, n - 1);
int ans = 0;
add(ans, mul(M.a[0][0], a));
add(ans, M.a[0][1]);
ans = mul(ans, 2);
printf("%d\n", ans);
}
return 0;
}
HDU 4565 So Easy! 矩阵快速幂的更多相关文章
- [ An Ac a Day ^_^ ] hdu 4565 数学推导+矩阵快速幂
从今天开始就有各站网络赛了 今天是ccpc全国赛的网络赛 希望一切顺利 可以去一次吉大 希望还能去一次大连 题意: 很明确是让你求Sn=[a+sqrt(b)^n]%m 思路: 一开始以为是水题 暴力了 ...
- hdu4565 So Easy! 矩阵快速幂
A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example ...
- HDU.1575 Tr A ( 矩阵快速幂)
HDU.1575 Tr A ( 矩阵快速幂) 点我挑战题目 题意分析 直接求矩阵A^K的结果,然后计算正对角线,即左上到右下对角线的和,结果模9973后输出即可. 由于此题矩阵直接给出的,题目比较裸. ...
- hdu 3117 Fibonacci Numbers 矩阵快速幂+公式
斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...
- 2013长沙邀请赛A So Easy!(矩阵快速幂,共轭)
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- hdu 2604 Queuing(矩阵快速幂乘法)
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...
随机推荐
- Java中常见的坑
概述 Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头.如果你习惯了别的语言,你读Java 的代码很 ...
- Spring连接数据库
public class Book { private int bookid; private String bookname; private String bookauthor; private ...
- JavaWeb项目开发中eclipse缓存问题
学习Java快2年了 有时候改完代码启动tomcat测试时,新代码不生效,这可能就是缓存问题. 所以平时就用以下几个方法解决,如果还是解决不了,就找老师吧! 1.清理项目 2.移除项目,清理tomca ...
- springboot 学习笔记(三)
(三)用jar包启动springboot项目 1.首先需要在pom文件中添加依赖,spring-boot-starter-parent包含有打包的默认配置,如果要修改的话要可以进行重新定义,具体内容参 ...
- js黑科技,使用offsetParent检测元素是否隐藏
var isHidden = function (element) { return (element.offsetParent === null);}; eg:
- 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩 ...
- apple-touch-icon-precomposed
<link rel="apple-touch-icon-precomposed" href=""> apple-touch-icon-precomp ...
- C# 使用解析json 嵌套方法
C#从网页不传参数 接收json数据 public String GetHtmlFromUrl(String url) { //Response.Write(url); //Response.End( ...
- JavaScript_11_验证
表单验证: JavaScript可用来在数据被送往服务器前对HTML表单中的输入数据进行验证 1. 是否填写了必填项目 2. 邮件地址是否合法 ... <form action="su ...
- Spark Job具体的物理执行
即使采用pipeline的方式,函数f对依赖的RDD中的数据集合的操作也会有两种方式: 1.f(record),f作用于集合的每一条记录,每次只作用于一条记录 2.f(records),f一次性作用于 ...