HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842
题目大意:棒子上套环。第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上。每个环可以取下或放上,cost=1。求最小cost。MOD 200907。
解题思路:
递推公式
题目意思非常无聊,感觉是YY的。
设$dp[i]$为取第i个环时的总cost。
$dp[1]=1$,$dp[2]=2$,前两个环取下是没有条件要求的。
从i=3开始,由于条件对最后的环限制最大,所以从最后一个环开始取。
$p[3]=5$(先取下第一个环,然后第三个环,然后放上第一个环,然后取下第二个环,然后取下第一个环)
$dp[4]=10$(规律是:取i环花费1,依赖花费$dp[i-1]$、$2*dp[i-2]$)
所以$dp[i]=dp[i-1]+2*dp[i-2]+1$
矩阵快速幂
任何递推数列都能构造矩阵求解,有N个参数的通项公式,至少需要构造$1*N$的矩阵
考虑到矩阵乘法的维数限制$[N,M]*[M,P]$,通常构造成$N*N$的矩阵。
构造方法就是按矩阵乘法的特性,先构造出幂矩阵第一列,然后YY出剩余列。
本题构造如下:
$\begin{bmatrix}f2 & f1 & 1\\ 0 & 0 & 0\\ 0 & 0 & 0\end{bmatrix}\begin{bmatrix}1 & 1&0 \\ 2 & 0&0 \\ 1& 0 &1 \end{bmatrix}=\begin{bmatrix}f3 & f2&1 \\
0 & 0&0 \\ 0& 0 &0\end{bmatrix}$
特判n=1、n=2,从n=3开始,幂(n-2)次,乘以基础f2、f1的矩阵。
代码
#include "cstdio"
#include "cstring"
#define LL long long
#define mod 200907
#define K 3
struct Matrix
{
LL mat[K][K];
Matrix() {memset(mat,,sizeof(mat));}
Matrix(LL *val)
{
int idx=;
for(int i=;i<K;i++)
for(int j=;j<K;j++)
mat[i][j]=val[idx++];
}
};
Matrix operator * (Matrix a,Matrix b)
{
Matrix ret;
for(int i=;i<K;i++)
for(int j=;j<K;j++)
{
ret.mat[i][j]=;
for(int k=;k<K;k++)
ret.mat[i][j]+=((a.mat[i][k]*b.mat[k][j])%mod);
}
return ret;
}
Matrix operator ^ (Matrix a,int n)
{
Matrix ret,base=a;
for(int i=;i<K;i++) ret.mat[i][i]=;
while(n)
{
if(n&) ret=ret*base;
base=base*base;
n>>=;
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
LL n;
while(scanf("%I64d",&n)&&n)
{
if(n==) printf("1\n");
else if(n==) printf("2\n");
else
{
LL bval[]={,,,,,,,,};
LL pval[]={,,,,,,,,};
Matrix Base(bval),Pow(pval),ans=Pow^(n-);
ans=Base*ans;
printf("%I64d\n",ans.mat[][]%mod);
}
}
}
HDU 2842 (递推+矩阵快速幂)的更多相关文章
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- hdu 6185 递推+矩阵快速幂
思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下) 假设 ...
- HDU Queuing(递推+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂)
Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...
- HDU6030 Happy Necklace(递推+矩阵快速幂)
传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...
- 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...
随机推荐
- 局域网聊天Chat(马士兵视频改进版)
Github地址: https://github.com/BenDanChen/Chat Chat 小小的聊天系统,主要是跟着网上的马士兵老师的公开视频然后再自己反思有什么地方需要改进的地方,然后大体 ...
- 三、jQuery--jQuery基础--jQuery基础课程--第7章 jQuery 动画特效
1.调用show()和hide()方法显示和隐藏元素 show()和hide()方法用于显示或隐藏页面中的元素,它的调用格式分别为:$(selector).hide(speed,[callback]) ...
- history 清空历史记录 或 history不记录历史命令
# vi ~/.bash_history 清空里面的记录,并退出当前shell # exit(一定要退出当前shell) # history 1 vi ~/.bash_history 2 histor ...
- Android中Thread和Service的区别zz
1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位.可以用 Thread 来执行一些异步的操作. 2). Service:Service 是android的一种机制,当 ...
- HDU3434 Sequence Adjustment
题意:给你含有n个数的序列,每次你可以选一个子序列将上面所有的数字加1或者减1,目标是把所有数字变成相同的,问最少步数,和那个相同的数字有多少种可能. 将原序列转化为差分序列,即a[2] - a[1] ...
- 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...
- 华为Mate8 NFC 时好时坏,怎么解决呢?
拿起手机朝桌子上磕几下,nfc就好用了.这是花粉总结的,我也试过,很灵.注意要带套,摄像头朝下,头部低一点往下磕.因为nfc芯片在头部,估计是接触不良.
- ASMCMD命令
安装好用的rlwrap工具,在环境变量里添加如下,就能实现显示当前路径(目录),目录补全的方便功能 alias asmcmd='rlwrap -r -i asmcmd –p' asmcmd>he ...
- linux下mysql的简单使用
写这篇的主要目的是记录一点mysql的基本使用方法,当然sql查询语句本来就有不少东西,这里就不一一介绍,这个网址有详细的教程(http://www.sdau.edu.cn/support/mysq_ ...
- [Linux] 取得服务器版本
1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如: [root@3.5.5Biz-46 ~]# lsb_release -a LSB Version: 1.3 Dis ...