ZOJ - 3690 Choosing number 矩阵快速幂
2015-05-30 18:30
357 查看
题目大意:有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)
最后只需要相加即可,还是得注意范围,别溢出了
问有多少种选择方法
解题思路:变化矩阵为(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)
最后只需要相加即可,还是得注意范围,别溢出了
[code]#include<cstdio> typedef long long ll; const int N = 2; const ll mod = 1e9 + 7; struct Matrix{ ll mat ; }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; }
相关文章推荐
- Java_Socket简单通信
- Chapter 4-5
- android linker (1) —— __linker_init()
- XenServer 6.5实战系列之十一:Install Update For XenServer 6.5
- 使用url_helper简化Python中Django框架的url配置教程
- 查看mysql表结构和表创建语句的方法
- poj-1113
- 读浅墨博客 十一 笔记(2)代码
- 【移动开发者沙龙 北京站】第一期 移动应用性能优化笔记 火热报名中
- android 曲线图的绘制
- spring AOP
- 实现挂号管理窗体功能代码分析(三)
- android EventBus源码解析
- ArrayList的类的简单使用
- linux ssh 无法连接解决
- 海马汽车经销商管理系统技术解析(三)应收管理
- 携程:运维债务的剖析与解决方案
- Android EventBus 实战
- 两种高效的服务器设计模型:Reactor和Proactor模型
- EEliod嵌入式实验4