[矩阵快速幂]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_ ...
随机推荐
- Cocoa 框架为什么采用两阶段的方式来创建对象?
对于之前一直使用C#语言的我来说,刚开始接触Objective-c来创建对象时很迷惑,为何创建对象一般情况下需要通过发送两个消息(调用两个方法)才能创建一个类实例对象(例如[[UIButton all ...
- Quartz 第五课 SimpleTriggers 官方文档翻译
对于SimpleTrigger你需要知道它的启动总是在一个特殊的时间点或者有你设置的重复时间段中.直白来说,如果你想在2005年1月13日,正好上午11时23分54秒触发,然后执行五次,每十秒钟. 从 ...
- windows搭建virtualbox虚拟机安装的android环境
1.首先安装virtualbox,从官网下载,安装完成之后在本地连接里面有virtualbox虚拟的网卡,可能会影响网络连接,一般禁用 2.下载android的镜像,完整名称是:android-x86 ...
- 在windows7中使用计划任务命令SCHTASKS查询计划任务失败的解决方案
造成这种原因是因为编码问题: 因此需要修改编码:chcp schtasks.exe /query 会报错 错误: 无法加载列资源. 修改编码为936为436就可以允许啦,但是中文不不能显示啦. ...
- 关于ThinkRock中的Topics
thinkrock是一款非常优秀的思想管理软件 主题是用来分类思想的,从而将思想具体化 比如:个人,书籍,小孩等等 在其中红色以及灰色是不推荐使用的,因为有别的意思.
- Linq to sql 接收存储过程返回的多个结果集
故事前提.......... 一.返回顺序结果集 存储过程实例 CREATE PROCEDURE MultipleResultTypesSequentially AS select * from pr ...
- 防止非授权用户调用DLL
1.首先要创建一个密钥文件(*.snk)
- C# 在运行时动态创建类型
C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译 ...
- [Database][SQL] 取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
- mysql 拷贝表插入新的表
insert into table1 select * from table; insert into talble set name = value;