首先,对于本质相同的构造,我们只计算字典序最小的序列

假设序列中最大的元素为top

我们很容易发现这样的序列一定是1,2,..,1,2,3,2,3,...,2,3,4,3,4.........,top-1,top(原谅我的语言表达……)

我们很容易发现这样的序列从第二个数开始一定是2,若干个(1,2),3,若干个(2,3),....,top,若干个(top-1,top)

我们很容易发现,这样的序列中有且仅有top-2个元素在一个连续的长度大于2的上升序列中,且不在两个端点上(也就是满足a[i]=a[i-1]+1且a[i+1]=a[i]+1)

并且不可能存在连续的长度大于2的下降序列(也就是没有位置满足a[i]=a[i-1]-1且a[i]=a[i+1]-1)

(这两句话说的窝好累TAT)(看不懂的就看划掉的2句话吧TAT)

那么我们就可以组合学乱搞了

详见代码(那个fm是(m-2)!,是常数优化用的,无视它就好,c(n,m)就是求组合数的)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 2000006
#define P 1000000007 using namespace std;
int pow2(int x,int y){
int ret=1;
while (y){
if (y&1) ret=(ll)ret*x%P;
x=(ll)x*x%P;
y=y>>1;
}
return ret;
} int fact[N],fm;
int c(int n,int m){
if (n<m) return 0;
return (ll)fact[n]*fm%P*pow2(fact[n-m],P-2)%P;
}
int n,m; int main(){
scanf("%d%d",&n,&m);
if (m<2||n<2){printf("%d\n",max(m,0));return 0;}
for (int i=fact[0]=1;i<=n/2+m/2+3;++i) fact[i]=(ll)fact[i-1]*i%P;
int ans=2,now[2]={1,0};
fm=pow2(fact[m-2],P-2);
for (int i=3;i<=n;++i){
(now[i&1]+=now[1^i&1])%=P;
if ((i-m-1)%2==0) (now[1^m&1]-=c((i-m-1)/2+m-2,m-2)-P)%=P;
(ans+=(now[0]+now[1])%P)%=P;
}
printf("%d\n",ans);
return 0;
}

  

bzoj4402: Claris的剑的更多相关文章

  1. bzoj 4402 Claris的剑 组合数学

    Claris的剑 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 375  Solved: 213[Submit][Status][Discuss] D ...

  2. 【BZOJ4402】Claris的剑(组合计数)

    题意: 给定数列的定义: 1.每个元素都是正整数 2.每个元素不能超过M 3.相邻两个元素的差的绝对值必须是1 4.第一个元素的值必须是1 求有多少个长度不超过N的合法的本质不同的序列 两个序列本质不 ...

  3. BZOJ.4402.Claris的剑(组合 计数)

    BZOJ 因为是本质不同,所以考虑以最小字典序计数. 假设序列最大值为\(m\),那么序列有这两种情况: \(1\ (1\ 2\ 1\ 2...)\ 2\ (3\ 2\ 3\ 2...)\ 3\ (4 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 安卓动态调试七种武器之长生剑 - Smali Instrumentation

    安卓动态调试七种武器之长生剑 - Smali Instrumentation 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是 ...

  6. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  7. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  8. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  9. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

随机推荐

  1. UIKit 力学教程

    import UIKit class ViewController: UIViewController { var animator: UIDynamicAnimator? override func ...

  2. SqlHelper.cs

    public static class SqlHelper { public static object FromDbValue(object value) { if (value == DBNull ...

  3. 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)

    1, String.Compare 方法 (String, String) 比较两个指定的 String 对象. 值 条件 小于零 strA 小于 strB. 零 strA 等于 strB. 大于零 ...

  4. JQuery常用方法(均实践过)

    1,使用jquery修改html元素的值 a,修改form的action的值(即修改html的属性值) 这个可以扩展为修改html元素的属性值的方法,使用的$("#id").att ...

  5. Splay整理

    伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.(来自百科) 伸展树的操作主要是

  6. Parallel.Invoke并行你的代码

    Parallel.Invoke并行你的代码 使用Parallel.Invoke并行你的代码 优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的 ...

  7. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...

  8. 利用Canvas进行绘制XY坐标系

    首先来一发图 绘制XY的坐标主要是利用Canvas setLeft和setBottom功能(Canvas内置坐标的功能) 1.首先WPF中的坐标系都是从左到右,从上到下的 即左上角位置(0,0)点,所 ...

  9. PHP面向对象编程知识要点

    1.基本概念 1.1.面向对象的阶段概念 OOA:面向对象分析 OOD:面向对象设计 OOP:面向对象编程 1.2.类的概念 面向对象中的类,实质上就是现实世界中一类有着相似属性事物抽象的概括,像鸟类 ...

  10. UWP 快速的Master/Detail实现

    最近在写快报(还没有写完)的过程中,一开始就遇到了这个Master/Detail如何实现的问题. 微软给出Demo并不符合要求,搜索后找到了今日头条开发者写的一篇 :实现Master/Detail布局 ...