hdu1588 矩阵快速幂
//看了很多的博客 后来队友指点才懂
//sum=f(g(0))+f(g(1))+....
//sum=A^(b-1)*|...|....
//要将b-1换,防止出现b=0时有负一,用A^b代替,取下面的即可
//这样问题成了 sum=A^b(A+A^(2k)+A^(3k)+...+A^(k(n-1)));
//令B=A^k次,就简单了。
/*
主要要求1+A+A^2+A^3+...+A^(n-1)次方
| A A | | A^2 A^2+A | | A^(k-1) A^(k-1)+A^(k-2)+A^(k-3)... |
令B= | | B^2=| | 这样可以得到 B^(n-1)=| |
| 0 1 | | 0 1 | | 0 1 |
*/
#include<stdio.h>
#include<string.h>
#define maxn 30
#define ll __int64
ll n,mod;
struct Mat
{
ll mat[maxn][maxn];
};
Mat cal1(Mat a,Mat b,int nn)//矩阵乘法
{
Mat c;
memset(c.mat,,sizeof(c.mat));
int i,j,k;
for(i=;i<nn;i++)
for(j=;j<nn;j++)
for(k=;k<nn;k++)
{
c.mat[i][j]+=((a.mat[i][k]*b.mat[k][j])%mod);
c.mat[i][j]%=mod;
}
return c;
}
Mat cal2(Mat a,ll k,int nn)//矩阵幂
{
int i,j;
Mat c;
for(i=;i<nn;i++)
for(j=;j<nn;j++)
if(i==j)c.mat[i][j]=;
else c.mat[i][j]=;
while(k)
{
if(k&)
c=cal1(c,a,nn);
k=k>>;
a=cal1(a,a,nn);
}
return c;
}
Mat A,B,S;
void initA()
{
A.mat[][]=;
A.mat[][]=;
A.mat[][]=;
A.mat[][]=;
}
void initB()
{
int i,j;
for(i=;i<;i++)
for(j=;j<;j++)
{
B.mat[i][j]=A.mat[i][j];
B.mat[i][j+]=A.mat[i][j];
}
for(i=;i<;i++)
for(j=;j<;j++)
B.mat[i][j]=;
for(i=;i<;i++)
for(j=;j<;j++)
if(i==j)
B.mat[i][j]=;
else B.mat[i][j]=;
}
Mat getmat()
{
int i,j;
Mat c;
for(i=;i<;i++)
for(j=;j<;j++)
c.mat[i][j-]=B.mat[i][j];
for(i=;i<;i++)
for(j=;j<;j++)
if(i==j)
c.mat[i][j]+=;
return c;
}
int main()
{
ll i,j,k,b;
while(scanf("%I64d %I64d %I64d %I64d",&k,&b,&n,&mod)!=EOF)
{
initA();
S=cal2(A,b,);
A=cal2(A,k,);
initB();
B=cal2(B,n-,);
Mat temp=getmat();
S=cal1(S,temp,);
/*for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
printf("%I64d ",S.mat[i][j]);
printf("\n");
}*/
printf("%d\n",S.mat[][]); }
}
hdu1588 矩阵快速幂的更多相关文章
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU5950(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...
- 51nod 1126 矩阵快速幂 水
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律
http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...
随机推荐
- javascript中的this应用
1. this作为全局变量2. 作为对象方法的调用3. 作为构造函数调用4. apply调用 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使 ...
- 3xian之所在(转)
最后一天,漫天飘起了雪花,假装欢送我离去. 这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong Answer的纠缠.还好lynncui在期间 ...
- Android的面孔_Actiyity
一.什么是Activity? 简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- springMVC+ajax分页查询
项目用到ajax技术的查询,查询结果很多时候要分页展示.这两天摸索了一下,在这里做一总结,方便自己随时查看, 也方便后人参考. 这里的顺序遵从从前台页面到后台控制器,业务层,Dao层,Mapper 下 ...
- Unity开发 资源准备
开发环境准备 插件资源 当有喜欢的资源,选择去泽国社区和纳金网下载,仅用于学习目的. Fbx查看器 下载版本对应的FBX插件 比如:fbx20133_quicktime_win.exe 对应Quick ...
- mac和centos下git安装
mac下面的git安装,这篇文章写的很详细了http://www.cnblogs.com/ccdev/archive/2012/09/12/2682098.html 谈谈centos下的安装.我用的是 ...
- ExtJS要利用观察者模式 去实现自定义的事件
// 要利用观察者模式 去实现自定义的事件 //1:由于浏览器他自己能定义内置的事件(click/blur...) // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事 ...
- js原生捕鱼达人(三)--完结
先给分享下我写完的效果,github有点卡,我没有压缩代码,不过效果可以看到 https://jasonwang911.github.io/ 转载请注明'转载于Jason齐齐的博客http://www ...
- Studying-Swift :Day01
学习地址:http://www.rm5u.com/ 或 http://www.runoob.com/ 如果创建的是 OS X playground 需要引入 Cocoa; 如果我们想创建 ...
- Linux Linux程序练习五
题目:编写两个进程a和b,利用共享内存技术,a向共享内存写字符串,b将从共享内存中读到的字符串在屏幕上打印出来. //创建共享内存区 #include <stdio.h> #include ...