ZOJ - 3690 Choosing number 矩阵快速幂
来源:互联网 发布:iphone2333软件 编辑:程序博客网 时间:2024/05/22 13:04
题目大意:有n个人排成一行,有m个数字,每个人可以选择1 – m的任一个数字,但有一个限制,如果相邻的两个人选择相同的数字的话,这个数字必须大于k
问有多少种选择方法
解题思路:变化矩阵为(m-k, k, m - k, k - 1),按行的写
设前一个数为j
如果j大于k的话,那么j后面可以跟上任一个数
如果j小于等于k,那么j后面只能跟上不等于k的数
如果有p种情况为前一个数大于k的,q种情况为前一个数小于等于k的,由上面可得,当前这个数大于k的情况有 p * (n -k) + q * (n - k)种,而当前这个数小于等于k的情况有p * k + q * (k - 1)
最后只需要相加即可,还是得注意范围,别溢出了
#include<cstdio>typedef long long ll;const int N = 2;const ll mod = 1e9 + 7;struct Matrix{ ll mat[N][N];}A, B, tmp;ll n, m, K;void init() { B.mat[0][0] = B.mat[1][1] = 1; B.mat[0][1] = B.mat[1][0] = 0; A.mat[0][0] = A.mat[1][0] = m - K; A.mat[0][1] = K; A.mat[1][1] = K - 1;}Matrix matMul(Matrix x, Matrix y) { for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) { tmp.mat[i][j] = 0; for(int k = 0; k < N; k++) tmp.mat[i][j] = (tmp.mat[i][j] + x.mat[i][k] * y.mat[k][j] ) % mod; } return tmp;}void solve() { while(n) { if(n & 1) B = matMul(B,A); A = matMul(A,A); n >>= 1; }}int main() { while(scanf("%lld%lld%lld", &n, &m, &K) != EOF) { if(n == 1) { printf("%lld\n", m); continue; } n--; init(); solve(); ll ans = 0; ans = (ans + (m - K) * B.mat[0][0] + K * B.mat[1][0]) % mod; ans = (ans + (m - K) * B.mat[0][1] + K * B.mat[1][1]) % mod; printf("%lld\n", ans); } return 0;}
0 0
- 矩阵快速幂 zoj-3690 Choosing number
- ZOJ - 3690 Choosing number 矩阵快速幂
- 【矩阵快速幂】ZOJ 3690 Choosing number
- 【ZOJ 3690】 Choosing number (矩阵快速幂)
- zoj 3690 Choosing number 递推+矩阵快速幂
- ZOJ 3690 Choosing number(矩阵快速幂)
- ZOJ 3690 Choosing number(矩阵快速幂)
- zoj 3690 Choosing number(矩阵乘法+dp)
- BNU Choosing number 矩阵快速幂
- zoj3690--Choosing number(dp,矩阵快速幂)
- BNUOJ28891 Choosing number(矩阵快速幂)
- zoj 3690 Choosing number
- ZOJ 3690 Choosing number
- ZOJ 3690 Choosing number
- ZOJ 3690 Choosing number(dp矩阵优化)
- ZOJ 2105 Number Sequence(矩阵快速幂)
- zoj3690 Choosing number 矩阵
- ZOJ 2105 Number Sequence(矩阵快速幂)
- 实现挂号管理窗体功能代码分析(三)
- 【移动开发者沙龙 北京站】第一期 移动应用性能优化笔记 火热报名中
- Android开源框架--ViewPagerIndicator的使用
- 自己工作的总结与前景
- ls命令只显示目录或文件
- ZOJ - 3690 Choosing number 矩阵快速幂
- excel 的 VLOOKUP 用法
- Hql带参数查询
- CentOS 7下Android NDK后缀为bin的文件处理
- 指针常见用法总结
- The Side-by-Side configuration information for "c:\xxxx.DLL" contains errors.
- JAVA和JVM运行原理揭秘
- hdu 1166 敌兵布阵(线段树入门-单点更新)
- cocos2dx3.3 C++和Android的网络连接状态