Choosing number

【题目链接】Choosing number

【题目类型】矩阵

&题解:

这题就和已经dp极像了,所以找方程就很困难了.可以这样找:

设f(n)是前n-1个人已经完成,第n个人选>k,g(n)是前n-1个人已经完成,第n个人选<=k.

那么f(n)=f(n-1)*(m-k)+g(n-1)*(m-k) g(n)=f(n-1)*k+g(n-1)*(k-1)

最后答案是f(n)+g(n) 所以这题难就难在想公式上

【时间复杂度】\(O(logn)\)

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int M= 1000000007;
ll n,m,k;
struct mat
{
ll m[4][4];
}A;
mat Mul(mat a,mat b)
{
mat c;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
c.m[i][j]=0;
for(int k=0;k<2;k++){
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
}
}
}
return c;
}
mat bPow(mat a,ll z)
{
mat un;
for(int i=0;i<2;i++)for(int j=0;j<2;j++)
un.m[i][j]=(i==j);
while(z){
if(z&1)
un=Mul(un,a);
a=Mul(a,a);
z>>=1;
}
return un;
}
int tb[4];
void Init()
{
tb[0]=m-k,tb[1]=k;
A.m[0][0]=A.m[0][1]=m-k;
A.m[1][0]=k,A.m[1][1]=k-1;
}
int main()
{
freopen("E:1.txt","r",stdin);
while(cin>>n>>m>>k){
Init();
A=bPow(A,n-1);
ll ans=0;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
ans=(ans+A.m[i][j]*tb[j])%M;
}
cout<<ans<<endl;
}
return 0;
}

最新文章

  1. 这些年MAC下我常用的那些快捷键
  2. What is SSL and what are Certificates?
  3. python数据持久存储:pickle模块的使用
  4. java 16 -4 LinkedList的特有功能
  5. OGNL和Struts2标签
  6. npm install express -g出错
  7. Python3学习之一环境搭建
  8. c语言 创建链表
  9. linux 内核提权
  10. SQL优化 MySQL版 -分析explain SQL执行计划与Extra
  11. ActiveMQ 的安装与使用(单节点)
  12. Cesium 中两种添加 model 方法的区别
  13. 【vue学习】vue 2.0版本以上创建项目的的步骤
  14. HDU4685 Prince and Princess【强连通】
  15. Linux CentOS更改文件的权限
  16. Java并发知识整理
  17. python之数据库内置方法以及pymysql的使用
  18. STL 基本概念
  19. python类的继承和多态
  20. 01-导航实例-QQ空间Demo示例程序源代码

热门文章

  1. ASP.NET MVC 系统过滤器、自定义过滤器
  2. Kafka &ndash; kafka consumer
  3. DbGridEh 一个单元格的值改变时另一单元格的值随之改变
  4. DBCHART直方图顶端显示数字
  5. day2_python基础
  6. 图-&gt;连通性-&gt;无向图的连通分量和生成树
  7. es基本查询相关的
  8. 【pyqtgraph绘图】Qt速成课程
  9. java Web开发基础(一)工程项目文档结构
  10. mysql大表更新sql的优化策略(转)