链接:https://www.nowcoder.com/acm/contest/71/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

WYF正试图用一个栈来构造一棵树,现在他已经构造了n个元素作为树的节点,只要将这n个元素依次入栈出栈就可以形成一棵树了。当然,这个问题与树并没有关系,所以它叫做WYF的栈。每次你可以入栈一个新元素或者当栈非空时出栈一个元素,n个元素必须依次入栈,而WYF希望其中第m个元素入栈之后,栈中恰好有k个元素,现在他想知道一共有多少种入栈出栈顺序满足这个条件。

输入描述:

第一行一个正整数T,表示数据组数。(1<=T<=10000)
对于每组数据包含一行三个正整数n,m,k。

输出描述:

 对于每组数据输出一个正整数表示答案。
 由于答案可能过大,所以只需要输出对109+7取模后的答案
 

输入例子:
2
3 3 3
3 3 2
输出例子:
1
2

-->

示例1

输入

2
3 3 3
3 3 2

输出

1
2
示例2

输入

5
10 3 2
10 2 2
10 7 5
10 6 2
10 7 6

输出

6864
11934
2200
3780
924
示例3

输入

2
5 4 4
5 2 1

输出

5
14

备注:

1<=n,m,k<=10^6

题解

找规律。

可以把过程分成两个阶段,答案是两个阶段的方案数乘积。

第一阶段:压入第$m$个元素时,刚好有$k$个元素在栈中,这样的状态停止的方案数记为$A$,显然$A$只和$m$和$k$有关,和$n$无关。

第二阶段:有$k$个元素在栈中,还剩$n-m$个元素未压入,将栈弹空为止的方案数记为$B$。

写个暴力可以发现两个阶段的方案数存在同一套规律,可以看代码中最后的注释部分。

#include <bits/stdc++.h>
using namespace std; typedef long long LL;
LL p = 1e9 + 7; const int maxn = 3e6 + 10;
LL f[maxn]; //******************************
//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
if(a==0&&b==0) return -1;//无最大公约数
if(b==0){x=1;y=0;return a;}
long long d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{
long long x,y;
long long d=extend_gcd(a,n,x,y);
if(d==1) return (x%n+n)%n;
else return -1;
} LL C(LL n, LL m) {
long long A = f[n];
long long B = f[n - m] * f[m] % p;
long long C = mod_reverse(B, p);
return A * C % p;
} LL work(LL n, LL m) {
if(n == m) return 1;
return (C(n * 2 - m - 1, n - m)
- C(n * 2 - m - 1, n - m - 1)
+ p) % p;
} int main() {
f[0] = 1;
for(long long i = 1; i < maxn; i ++) {
f[i] = (f[i - 1] * i) % p;
}
int T;
scanf("%d", &T);
while(T --) {
LL n, m, k;
scanf("%lld%lld%lld", &n, &m, &k);
if(m > n || m < k) {
printf("0\n");
continue;
}
LL A = work(m, k);
LL B = work(n + k + 1 - m, k + 1);
LL ans = A * B % p;
printf("%lld\n", ans);
}
return 0;
}
/* A:
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 1
2 | 1 1
3 | 2 2 1
4 | 5 5 3 1
5 | 14 14 9 4 1
6 | 42 42 28 14 5 1
7 | 132 132 90 48 20 6 1 B:
n = 1
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 1
2 |
3 |
4 |
5 |
6 |
7 | n = 2
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 2
2 | 1 1
3 |
4 |
5 |
6 |
7 | n = 3
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 5
2 | 2 3
3 | 1 1 1
4 |
5 |
6 |
7 | n = 4
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 14
2 | 5 9
3 | 2 3 4
4 | 1 1 1 1
5 |
6 |
7 | n = 5
---+-----------------------------------
m\k| 1 2 3 4 5 6 7
---+-----------------------------------
1 | 42
2 | 14 28
3 | 5 9 14
4 | 2 3 4 5
5 | 1 1 1 1 1
6 |
7 | */

Wannafly挑战赛9 D - 造一造的更多相关文章

  1. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  2. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  3. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  4. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  5. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

  6. Wannafly挑战赛25C 期望操作数

    Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...

  7. Wannafly挑战赛18B 随机数

    Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...

  8. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  9. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  10. Wannafly挑战赛18 E 极差(线段树、单调栈)

    Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...

随机推荐

  1. 【精选】Ubuntu 14.04 安装Nginx、php5-fpm、ThinkPHP5.0(已经测试上线)

    sudo apt-get update 安裝Nginx https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04 安裝完成後,Nginx的 ...

  2. bzoj 5055: 膜法师——树状数组

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

  3. 初时Python博大精深

    Python是解释型语言 编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行.缺点:编 ...

  4. Linux基础-vim编辑器

    使用vi编辑器编辑文件/1.txt进入编辑模式写入内容“hello world” 命令行模式输入i,进入编辑模式 写入HelloWorld,按ESC进入命令行模式,输入:进入扩展模式输入wq保存退出 ...

  5. Android平台介绍

    一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操 ...

  6. 可能是最漂亮的Spring事务管理详解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...

  7. Virut样本取证特征

    1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...

  8. LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】

    转自:http://biancheng.dnbcw.info/linux/257411.html [1] 如何编译X86下的 uBuntu APP---非常简单:            gcc -o ...

  9. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  10. linux通配符,grep和 egrep区别

    其实主要是正则表达式中的一些特殊语法.在网上找的几篇文章,截取相关部分贴在了下面,方便以后翻阅. 参考:http://hi.baidu.com/sei_zhouyu/item/c18e1a950d2e ...