题意    就是说给你 N 个人站成一排,现在每个人都可以选择 1~M 中间的任意一个数字,相邻的两个人数字相同,则他必须是是 >  K 的  问方案总数;

方法    先求出递推式,然后用矩阵快速 mo mi  构造矩阵 时候很简单  递推方程式为   f(n) = f(n-1)*M - f( n-1 ) + f( n-2 )*( m - k ) 就是当前这个人必定是从前面那个人的所有组合数中满足条件的数量  × M 得到当前这个人的所有状态 但还需要减去 前面那个人有多少个是 以 <=K  结尾 的总数; 方法是 前面那个状态记录了所有满足的状态,前面 ( n - 2 )×( m - k ) 记录了上一个状态有多少是大于 K 结尾的  总数 减去  <= k  的便是小于的;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define mod 1000000007
using namespace std; struct date {
long long X[][];
}tab;
long long lt,rt,up,dn,N,M,K;
date mix( date a,date b )
{
date c;
for( int i = dn; i <= up; i++ ) // 纵坐标 从上到下
for( int j = lt; j <= rt; j++ ) // 横坐标 从左到右
{
c.X[i][j] = ;
for( int k = lt; k <= rt; k++ )
c.X[i][j] = (c.X[i][j] + (a.X[i][k]*b.X[k][j])%mod)%mod;
}
return c;
}
date work( int N )
{
if( N == )return tab;
date a = work( N/ );
a = mix( a,a );
if( N% ) a = mix( tab,a );
return a;
}
int main( )
{
while( scanf("%lld%lld%lld",&N,&M,&K) != EOF )
{
tab.X[][] = ; tab.X[][] = M-K;
tab.X[][] = ; tab.X[][] = M-;
lt = ; rt = ; dn = ; up = ;
date a = work( N- );
//cout<<a.X[0][0]<<" "<<a.X[0][1]<<" "<<a.X[1][0]<<" "<<a.X[1][1]<<endl;
date b; b.X[][] = M; b.X[][] = M*M - K;
b.X[][] = ; b.X[][] = ;
date c = mix( b,a );
printf("%lld\n",c.X[][]);
}
return ;
}

zoj 3690 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 &amp; HDU 3658 (矩阵高速幂+公式递推)

    ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...

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

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

  5. ZOJ 3622 Magic Number 打表找规律

    A - Magic Number Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  6. ZOJ 3436 July Number(DFS)

    题意   把一个数替换为这个数相邻数字差组成的数  知道这个数仅仅剩一位数  若最后的一位数是7  则称原来的数为 July Number  给你一个区间  求这个区间中July Number的个数 ...

  7. ZOJ 3233 Lucky Number

    Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...

  8. [ZOJ 3622] Magic Number

    Magic Number Time Limit: 2 Seconds      Memory Limit: 32768 KB A positive number y is called magic n ...

  9. ZOJ 3622 Magic Number(数)

    题意  假设一个正整数y满足  将随意正整数x放到y的左边得到的数z满足 z%y==0  那么这个数就是个Magic Number   给你一个范围  求这个范围内Magic Number的个数 令 ...

随机推荐

  1. 深入浅出ES6(十):集合

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 前段时间,官方名为“ECMA-262,第六版,ECMAScript 2015语言 ...

  2. 概述Log4j简介

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j. Log4j是Apache的一个开放源代码项目,通过使用Log4j ...

  3. HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数

    GTW likes function      Memory Limit: 131072/131072 K (Java/Others) 问题描述 现在给出下列两个定义: f(x)=f_{0}(x)=\ ...

  4. 10 signs you’re dating the wrong person

    10 signs you’re dating the wrong person10个迹象表明TA不是你的真心人       Do you have any exes who were so awful ...

  5. java 基本数据类型 回顾

  6. Struts2笔记——第一个实例HelloWorld

    1.创建新的Dynamic Web项目   ------------------------------------------ 2.struts2框架配置   ------------------- ...

  7. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...

  8. 分析和解析PHP代码的7大工具

    PHP已成为时下最热门的编程语言之一,然而却有许多PHP程序员苦恼找不到合适的工具来帮助自己分析和解析PHP代码.今天小编就为大家介绍几个非常不错的工具,来帮助程序员们提高自己的工作效率,一起来看看吧 ...

  9. 生成24位字符串ID__IdGenerator.java

    此工具类用于生成24位字符串ID,唯一不重复.直接通过 IdGenerator.get() 获取. 源码如下:(点击下载源码 - IdGenerator.java ) import java.net. ...

  10. 总结Allegro元件封装(焊盘)制作方法[修整]

    总结Allegro元件封装(焊盘)制作方法 在Allegro系统中,建立一个零件(Symbol)之前,必须先建立零件的管脚(Pin).元件封装大体上分两种,表贴和直插.针对不同的封装,需要制作不同的P ...