题意:给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!的更多相关文章

  1. 2013长沙邀请赛A So Easy!(矩阵快速幂,共轭)

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 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 ...

  3. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  4. hdu 4565 So Easy!(矩阵+快速幂)

    题目大意:就是给出a,b,n,m:让你求s(n); 解题思路:因为n很可能很大,所以一步一步的乘肯定会超时,我建议看代码之前,先看一下快速幂和矩阵快速幂,这样看起来就比较容易,这里我直接贴别人的推导, ...

  5. hdu 4565 So Easy! (共轭构造+矩阵快速幂)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4565 题目大意: 给出a,b,n,m,求出的值, 解题思路: 因为题目中出现了开根号,和向上取整后求 ...

  6. 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 ...

  7. 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)

    [解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...

  8. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  9. [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]

    题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...

随机推荐

  1. 引用类型之Array类型

    Array类型 ECMAScript数组与其它语言数组一样,都是数据的有序列表.但是ECMAScript数组的每一项可以保存任何类型的数据.而且,ECMAScript数组是可以动态调整的. 1.创建和 ...

  2. iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存

    iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...

  3. Axure RP 各个版本中文版 汉化包 破解版 下载地址及注册码

    导读:Axure RP Pro是一个产品经理必备的交互原型设计工具,能够高效率制作产品原型,快速绘制线框图.流程图.网站架构图.示意图.HTML模版等.Axure RP已被一些大公司采用.Axure ...

  4. Linux C 程序 文件属性,文件删除(15)

    dup ,dup2,fcntl,ioctl系统调用 . dup ,dup2 函数 int dup(int oldfd) int dup(int oldfd , int newfd) dup用来复制参数 ...

  5. CSS样式display:none和visibility:hidden的区别

    同样是隐藏,display:none与visibility:hidden有什么区别呢? 虽然display:none与visibility:hidden都能达到隐藏可见元素的作用(视觉上),但事实上, ...

  6. php中封装的curl函数(抓取数据)

    介绍一个封闭好的函数,封闭了curl函数的常用步骤,方便抓取数据. 代码如下: <?php /** * 封闭好的 curl函数 * 用途:抓取数据 * edit by www.jbxue.com ...

  7. 有关linux日志分析的详细介绍

    linux的日志文件可以帮助我们了解系统所处的状态,比如查出哪些用户有登入,及其它安全相关的一些问题. linux下的日志分析. 以下内容,部分参考了:探讨 linux 日志分析 这篇文章. 1.了解 ...

  8. PHP的$_SERVER['HTTP_HOST']获取服务器地址功能详解,$_SERVER['HTTP_X_FORWARDED_HOST']

    uchome的index文件中的二级域名功能判断,使用了php的$_SERVER['HTTP_HOST'],开始对这个不是很了解,所以百度了一下,发现一篇帖子有点意思,转发过来做个记录. 在php中, ...

  9. RDD操作

    RDD操作 1.对一个数据为{1,2,3,3}的RDD进行基本的RDD转化操作 函数名 目的 示例 结果 map() 函数应用于RDD中的每个元素 rdd.map(x=>x+1) {2,3,4, ...

  10. 正则表达式模块re

    正则表达式通过特定的式子匹配某种类型的字符串.对字符串进行匹配验证或者从大量的字符串里提取出特定的信息. 正则表达式包含普通字符和特殊字符.大部分的普通字符如‘A’或‘0’可以简单的来匹配自己.如te ...