题目链接:https://vjudge.net/problem/ZOJ-3690

题目意思: 有n个人,每个人可以从m个数中选取其中的一个数,而且如果两个相邻的数相同,则这个数大于等于k,问这样的数一共有多少种选择,结果取模。

思路:可能是算递推式子的能力还不够吧?没有推出来。这里我们我们运用划分的思想定义F[i]表示有i个人且最后一个人选的数组大于k选择数量,G[i]表示有i个人且最后一个人选的数组小于等于k的数量。

我们可以得到以下递推式子:

F[i]=(m-k)*(F[i-1]+G[i-1]),注:第i个人选择的数大于k,当然是i-1个人最后一个人选择的数大于k和最后一个人小于等于k的数量之和乘以大于k的数的数量,因为第i个人选择的是大于k的数,所以不被题目的限制条件限制。

G[i]=k*F[i-1]+(k-1)*G[i-1],注:第i个人选择的数小于等于k,当然是i-1个人最后一个人选择大于k的数量乘以k加上i-1个人最后一个人选择小于等于k,为了让相邻的选择不同,所以乘以(k-1)。

答案就是G[n]+F[n]。

算递推式子的时候,看到这种以某个数k为限制的时候,应该以k为划分去思考问题。对今后算递推式子也算有点启发吧。

代码:(有了递推式子以后代码就很简单了,套路的矩阵快速幂)

 //Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define size 2
#define MOD 1000000007
using namespace std;
typedef long long ll;
ll a,b,c;
struct Matrix{
ll mat[][];
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
for(int i=;i<size;i++)
for(int j=;j<size;j++){
tmp.mat[i][j]=;
for(int k=;k<size;k++){
tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j]%=MOD;
}
}
return tmp;
}
};
Matrix POW(Matrix m,ll k){
Matrix ans;
ans.clear();
for(int i=;i<size;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
while(cin>>a>>b>>c){
Matrix m;
m.clear();
m.mat[][]=m.mat[][]=b-c;
m.mat[][]=c;m.mat[][]=c-;
Matrix ans=POW(m,a-);
ll ans1=,ans2=;
ans1=((ans.mat[][]*(b-c))%MOD+(ans.mat[][]*c)%MOD)%MOD;
ans2=((ans.mat[][]*(b-c))%MOD+(ans.mat[][]*c)%MOD)%MOD;
cout<<(ans1+ans2)%MOD<<endl;
}
return ;
}

ZOJ3690—Choosing number的更多相关文章

  1. ZOJ 3690 Choosing number(矩阵)

    Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...

  2. ZOJ 3690 Choosing number(dp矩阵优化)

    Choosing number Time Limit: 2 Seconds      Memory Limit: 65536 KB There are n people standing in a r ...

  3. zoj 3690 Choosing number

    题意    就是说给你 N 个人站成一排,现在每个人都可以选择 1-M 中间的任意一个数字,相邻的两个人数字相同,则他必须是是 >  K 的  问方案总数: 方法    先求出递推式,然后用矩阵 ...

  4. Choosing number ZOJ - 3690 (矩阵快速幂)

    题意:n个人站成一排,每个人任意从1——m中任意取一个数,要求相邻两个人的如果数字相同,数字要大于k. 分划思想推导表达式: 假设  i  个人时.第i个人的选择有两种一种是选择小于等于k的数,另一种 ...

  5. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

  6. ACM 矩阵题目整理

    先从最基础的矩阵快速幂加速递推开始. HDU 1005 Number Sequence |f[n-2],f[n-1]|* |0 B| =|f[n-1], B*f[n-2]+A*f[n-1]|=|f[n ...

  7. 2013年9月份阿里JAVA面试经历

    面试时间:2013-9 面试地点:合工大 面试内容: 1. struts2怎么实现的,原理是什么 2. session是怎么实现的?存储在哪里? 3. Java怎么创建链表的? 定义一个结点类,再定义 ...

  8. 吴恩达机器学习笔记51-初始值重建的压缩表示与选择主成分的数量K(Reconstruction from Compressed Representation & Choosing The Number K Of Principal Components)

    一.初始值重建的压缩表示 在PCA算法里我们可能需要把1000 维的数据压缩100 维特征,或具有三维数据压缩到一二维表示.所以,如果这是一个压缩算法,应该能回到这个压缩表示,回到原有的高维数据的一种 ...

  9. 吴恩达机器学习笔记47-K均值算法的优化目标、随机初始化与聚类数量的选择(Optimization Objective & Random Initialization & Choosing the Number of Clusters of K-Means Algorithm)

    一.K均值算法的优化目标 K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为: 其中

随机推荐

  1. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

  2. BI - SSIS, SSAS, SSRS 之间的关系

    BI - SSIS, SSAS, SSRS 之间的关系 2015-06-05 SSIS, SSAS, SSRS,它们是一套相辅相成的工具,组成了微软的BI(商业智能)解决方案. 图1 微软SQL SE ...

  3. Python教程:[43]Word基本操作

    使用python操作Word用到了win32com模块,我们现在就要介绍一下python对Word的基本操作,文章涉及到如何与Word程序建立连接.如果与Word文档建立连接的,以及对Word文档的基 ...

  4. (转)love2d有用的辅助库--gamework

    此文转自朱大仙,感谢他的劳作. 翻译来源地址:https://github.com/Kadoba/gamework gamework是控制LOVE2D游戏进程流的一个项目. ↑ 这个是按原文译的, 当 ...

  5. jQuery和JS对比

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Linux快速定位并且杀掉占用端口的进程

    1.定位 lsof -i:8811(端口号) 2.杀掉进程 kill -9 63924

  7. Elk使用笔记(坑)(2017-02-17更新)

    Elk使用笔记(坑)(2017-02-17更新) 作者: admin 时间: 2016-12-07 分类: 工具,数据 主要记录使用过程终于到的一些坑和需要注意的地方,有些坑想不起来了,以后再完善补上 ...

  8. CSS(七):浮动

    一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...

  9. thinkphp 命名规范

    目录和文件命名 目录和文件名采用 小写+下划线,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写): 类名和 ...

  10. 标签响应javascript的href处理[转载]

    为了给一个<a />标签绑定javascript,但又不让它跳转链接,大家习惯上用的都是 <a href="javascript:;" onclick=" ...