HDU2256&&HDU4565:给一个式子的求第n项的矩阵快速幂
HDU2256
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256
题意:求(sqrt(2)+sqrt(3))^2n%1024是多少。
这个题算是hdu4565的一个常数版本了,所以我们先说这道题。对于这道题的做法我们可以计算((sqrt(2)+sqrt(3))^2)^n=(5+2*sqrt(6))^n,对于(5+2*sqrt(6))^n我们知道答案必定是以an+bn*sqrt(6),而对于下一项我们只需要求(an+bn*sqrt(6))*(5+2*sqrt(6))=5*an+12*bn+2*an*sqrt(6)+5*bn*sqrt(6),所以a(n+1)=5*an+12*bn; b(n+1)=2*an+5*bn。有了这个递推式我们就可以构造矩阵求an,bn。
这里还有一点对于(5+2*sqrt(6))^n=an+bn*sqrt(6); 同理(5-2*sqrt(6))^n=an-bn*sqrt(6);两式相加(5+2*sqrt(6))^n+(5-2*sqrt(6))^n=2*an,当n趋于无穷的时候lim(5-2*sqrt(6))^n=0,因为5-2*sqrt(6)<1。
所以我们可以得到答案(5+2*sqrt(6))^n约等于2*an,且实际值是比2*an要小的且小于2*an-1要大的,所以由题目的意思我们向下取整,ans=2*an-1;具体看代码,其他都是矩阵快速幂的模板。
- //Author: xiaowuga
- #include <bits/stdc++.h>
- #define maxx INT_MAX
- #define minn INT_MIN
- #define inf 0x3f3f3f3f
- #define n 2
- #define MOD 1024
- using namespace std;
- typedef long long ll;
- struct Matrix{
- ll mat[][];
- Matrix operator * (const Matrix & m) const{
- Matrix tmp;
- for(int i=;i<n;i++)
- for(int j=;j<n;j++){
- tmp.mat[i][j]=;
- for(int k=;k<n;k++){
- tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
- tmp.mat[i][j]%=MOD;
- }
- }
- return tmp;
- }
- };
- Matrix POW(Matrix &m,int k){
- Matrix ans;
- memset(ans.mat,,sizeof(ans.mat));
- for(int i=;i<n;i++) ans.mat[i][i]=;
- while(k){
- if(k&) ans=ans*m;
- k/=;
- m=m*m;
- }
- return ans;
- }
- int main() {
- ios::sync_with_stdio(false);cin.tie();
- ll T,num;
- cin>>T;
- while(T--){
- cin>>num;
- Matrix m;
- m.mat[][]=; m.mat[][]=; m.mat[][]=; m.mat[][]=;
- Matrix ans=POW(m,num-);
- ll sum=,f[]={,};
- for(int i=;i<;i++)
- sum+=ans.mat[][i]*f[i]%MOD;
- sum%=MOD;
- ll x=(*sum-)%MOD;
- cout<<x<<endl;
- }
- return ;
- }
HDU4565
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565
题意:算是上面那道题的一个升级版本啦。现在是a和b不是固定的的常数了。和上面的做法一样。注意题目中给出a-sqrt(b)<1的条件,所以基本和上道题是一样的了,类比一下吧!很简单的。但是这里是向上取整,所以答案是2*an。具体看代码吧。由于上面那道题在常数情况下已经说得很明白了。这道题就不说了
- //Author: xiaowuga
- #include <bits/stdc++.h>
- #define maxx INT_MAX
- #define minn INT_MIN
- #define inf 0x3f3f3f3f
- #define size 2
- int MOD;
- using namespace std;
- typedef long long ll;
- struct Matrix{
- ll mat[][];
- void clear(){
- memset(mat,,sizeof(mat));
- }
- Matrix operator * (const Matrix & m) const{
- Matrix tmp;
- for(int i=;i<size;i++)
- for(int j=;j<size;j++){
- tmp.mat[i][j]=;
- for(int k=;k<size;k++){
- tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
- tmp.mat[i][j]%=MOD;
- }
- }
- return tmp;
- }
- };
- Matrix POW(Matrix &m,int k){
- Matrix ans;
- memset(ans.mat,,sizeof(ans.mat));
- for(int i=;i<size;i++) ans.mat[i][i]=;
- while(k){
- if(k&) ans=ans*m;
- k/=;
- m=m*m;
- }
- return ans;
- }
- int main() {
- ios::sync_with_stdio(false);cin.tie();
- ll a,b,n;
- while(cin>>a>>b>>n>>MOD){
- Matrix m;
- m.clear();
- m.mat[][]=m.mat[][]=a%MOD;
- m.mat[][]=b%MOD;m.mat[][]=;
- Matrix ans=POW(m,n-);
- ll sum=(ans.mat[][]*a%MOD+ans.mat[][]%MOD)%MOD;
- cout<<*sum%MOD<<endl;
- }
- return ;
- }
HDU2256&&HDU4565:给一个式子的求第n项的矩阵快速幂的更多相关文章
- 515Nod 1126 求递推序列的第n项【矩阵快速幂】
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
- 51Nod 1126 求递推序列的第N项(矩阵快速幂)
#include <iostream> #include <algorithm> #include <cmath> #define MOD 7 #define N ...
- hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)
Problem DescriptionA为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据.每组数据的第一行有 ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...
- hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...
- 求幂大法,矩阵快速幂,快速幂模板题--hdu4549
hdu-4549 求幂大法.矩阵快速幂.快速幂 题目 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 ...
- hdu4686 简单的矩阵快速幂求前n项和
HDU4686 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意:题目说的很清楚了,英语不好的猜也该猜懂了,就是求一个表达式的前n项和,矩阵 ...
- UOJ424 Count 生成函数、多项式求逆、矩阵快速幂
传送门 两个序列相同当且仅当它们的笛卡尔树相同,于是变成笛卡尔树计数. 然后注意到每一个点的权值一定会比其左儿子的权值大,所以笛卡尔树上还不能够存在一条从根到某个节点的路径满足向左走的次数\(> ...
随机推荐
- [k8s]metricbeat的kubernetes模块&kube-metric模块
正确姿势启动metricbeat metricbeat.modules: - module: system metricsets: - cpu - filesystem - memory - netw ...
- C++ virtual继承
C++ virtual继承的还有一种名称是菱形继承.主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝.造成数据不统一的问题,以致于在进行类释放时造成内存泄漏. 将共同的基类作为虚基类 ...
- angular多个控制器如何共享数据
多个控制器之间共享数据,通常两种方式,一种是在控制器里通过$scope.$$prevSibling或$scope.$$nextSibling获得另一个控制器的作用域对象. 第二种是通过服务的方式,也是 ...
- zepto中的tap穿透
有一个项目,浮层上是有点击的按钮,但是用tap就会穿透,触发浮层下的页面的点击事件.后来问同事和经过自己尝试,发现用click就可以解决这个问题.
- Linux下C语言的调试
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- rsync详解之exclude排除文件
rsync详解之exclude排除文件 问题:如何避开同步指定的文件夹? --excludersync --exclude files and folders http://articles.sl ...
- 使用JAVASCRIPT进行数据完整性验证
页面输入完整性是编写BS经常遇到的问题,如果那里需要就到那里写,那可是要花不少的时候,并且造成不必要的浪费,下面是一个通过校验脚本,使用非常方便,通过传入FORM名就可以进行校验,通过在页面控件中增加 ...
- java 多线程 3 synchronized 同步
多任务编程的难点在于多任务共享资源.对于同一个进程空间中的多个线程来说,它们都共享堆中的对象.某个线程对对象的操作,将影响到其它的线程. 在多线程编程中,要尽力避免竞争条件(racing condit ...
- java内存溢出怎么解决
java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemory ...
- scanner, BufferedReader, InputStreamReader 区别及特殊字符的输入
1. Scanner是一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器!也就是控制台应用程序最为常用的文本输入方式!Scanner取得输入数据的依据是空格符:如按下空格键,Tab键或者En ...