[矩阵快速幂]HDOJ4565 So Easy!
题意:给a, b, n, m
求 $\left \lceil ( a+ \sqrt b )^n \right \rceil$ % m
看到 $( a+ \sqrt b )^n$ 虽然很好联想到共轭 但是推出矩阵还是比较难的
$(a+\sqrt b)^n + (a-\sqrt b)^n$
= $(C^0_n a^n + C^1_n a^{n-1} \sqrt{b} + ... + C^{n-1}_n a \sqrt{b}^{n-1} + C^n_n (\sqrt b)^n)$
+ $(C^0_n a^n + (-1)^1 C^1_n a^{n-1} \sqrt{b} + ... + (-1)^{n-1} C^{n-1}_n a \sqrt{b}^{n-1} + (-1)^n C^n_n \sqrt b^{ n})$
对于 n+1 项 $C^i_n$ 其中所有 i 为奇数的都消掉了 只剩下偶数项
= $2 \sum\limits_{i=0,i为偶数}^n C^i_n a {\sqrt b}^{ i}$
偶数 所以可以把根号开掉 得到
= $2 \sum\limits_{i=0}^{\frac{n}{2}} C^i_n a {b}^{ i}$
很明显这是一个整数
数据范围为:$(a-1)^2 < b < a^2$
那么 $a-1 < \sqrt b < a$
那么 $0 < a-\sqrt b < 1$
$(a+\sqrt b)^n + (a-\sqrt b)^n$ 是个整数 同时 $a-\sqrt b$ 大于0 小于1
因此 $\left \lceil ( a+ \sqrt b )^n \right \rceil = (a+\sqrt b)^n + (a-\sqrt b)^n$ (画上这个等号真是不容易!)
求 $(a+\sqrt b)^n + (a-\sqrt b)^n$ 就变得很简单了
通过二次特征方程$x^2-2ax+(a^2-b)=0$
可以得到$S_n = 2aS_{n-1}+(b-a^2)S_{n-2}$
写成矩阵形式:
$$\begin{pmatrix} S_n\\S_{n-1}\end{pmatrix} = \begin{pmatrix} a & {b-a^2}\\ 1 & 0\end{pmatrix} \begin{pmatrix} S_{n-1}\\S_{n-2}\end{pmatrix}$$
$$= {\begin{pmatrix} a & {b-a^2}\\ 1 & 0\end{pmatrix}}^{n-1} \begin{pmatrix} 2a \\ 2 \end{pmatrix}$$
$b-a^2$ 很容易为负 n-1次方之后 更加负
为了防止答案为负 记得多加几个mod哟~
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mod;
struct Mat
{
LL t[][];
};
Mat mul(Mat a, Mat b)
{
Mat c;
memset(c.t, , sizeof(c.t));
for(int i=;i<;i++)
for(int k=;k<;k++)
if(a.t[i][k])
for(int j=;j<;j++)
c.t[i][j]=(c.t[i][j]+a.t[i][k]*b.t[k][j])%mod;
return c;
}
Mat expo(Mat p, LL k)
{
if(k==)
return p;
Mat e;
memset(e.t, , sizeof(e.t));
for(int i=;i<;i++)
e.t[i][i]=;
if(k==)
return e;
while(k)
{
if(k & )
e=mul(p, e);
p=mul(p, p);
k>>=;
}
return e;
}
LL MOD(LL x)
{
while(x<)
x+=mod;
return x%mod;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
LL a, b, n;
while(cin>>a>>b>>n>>mod)
{
Mat m;
m.t[][]=*a, m.t[][]=b-a*a;
m.t[][]=, m.t[][]=;
Mat ans=expo(m, n-);
cout<<MOD(ans.t[][]**a+*ans.t[][])<<endl;
}
return ;
}
HDOJ 4565
[矩阵快速幂]HDOJ4565 So Easy!的更多相关文章
- 2013长沙邀请赛A So Easy!(矩阵快速幂,共轭)
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 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 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- hdu 4565 So Easy!(矩阵+快速幂)
题目大意:就是给出a,b,n,m:让你求s(n); 解题思路:因为n很可能很大,所以一步一步的乘肯定会超时,我建议看代码之前,先看一下快速幂和矩阵快速幂,这样看起来就比较容易,这里我直接贴别人的推导, ...
- hdu 4565 So Easy! (共轭构造+矩阵快速幂)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4565 题目大意: 给出a,b,n,m,求出的值, 解题思路: 因为题目中出现了开根号,和向上取整后求 ...
- hdu4565 So Easy!(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 题解:(a+√b)^n=xn+yn*√b,(a-√b)^n=xn-yn*√b, (a+√b)^n ...
- 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
[解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]
题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...
随机推荐
- (转)Spark安装与学习
摘要:Spark是继Hadoop之后的新一代大数据分布式处理框架,由UC Berkeley的Matei Zaharia主导开发.我只能说是神一样的人物造就的神器,详情请猛击http://www.spa ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- javascript-对象的函数(一)
Date.prototype.Format = function(fmt) { //author: meizz var o = { "M+" : this.getMonth()+1 ...
- Web性能压力测试工具之Siege详解
PS:Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力.可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进 ...
- margin的BUG(2)
继续上一次的学习,这次又发现了margin的第二个bug.既当同时对两个相邻的div盒子设置margin时,他们之间的间隙不能正常显示. 具体表述为:先建立两个div1和div2 <div cl ...
- Object-C - 类的定义
http://www.cnblogs.com/zhangweia/archive/2011/11/01/2231549.html 1. 文件分为.h:定义接口,及其属性,方法说明. .m :是实现类. ...
- android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解
第一种情况:有MAIN,无LAUNCHER,程序列表中无图标 原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 第二种情况:无MAIN,有LAU ...
- ES6学习笔记(十四)
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Prom ...
- zencart后台增加菜单选项
如果要在程序中使用额外的参数,在后台控制,添加到菜单属性 在后台 SQL脚本 运行如下 SQL语句 INSERT INTO configuration (configuration_title, co ...
- php array_walk 和 array_reduce函数
1.array_walk:将数组中的元素(键+值)依次取出传给处理的函数,函数处理完就完了,没有返回值. $arr1=array( 'name'=>'zhangsan', 'age'=>3 ...