Wannafly挑战赛9 D - 造一造
链接:https://www.nowcoder.com/acm/contest/71/D
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行一个正整数T,表示数据组数。(1<=T<=10000)
对于每组数据包含一行三个正整数n,m,k。
输出描述:
输入例子:
2
3 3 3
3 3 2
输出例子:
1
2
-->
输入
2
3 3 3
3 3 2
输出
1
2
输入
5
10 3 2
10 2 2
10 7 5
10 6 2
10 7 6
输出
6864
11934
2200
3780
924
输入
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 - 造一造的更多相关文章
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并
[Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...
- Wannafly挑战赛18 E 极差(线段树、单调栈)
Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...
随机推荐
- 【精选】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的 ...
- bzoj 5055: 膜法师——树状数组
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
- 初时Python博大精深
Python是解释型语言 编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行.缺点:编 ...
- Linux基础-vim编辑器
使用vi编辑器编辑文件/1.txt进入编辑模式写入内容“hello world” 命令行模式输入i,进入编辑模式 写入HelloWorld,按ESC进入命令行模式,输入:进入扩展模式输入wq保存退出 ...
- Android平台介绍
一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操 ...
- 可能是最漂亮的Spring事务管理详解
Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...
- Virut样本取证特征
1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...
- LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】
转自:http://biancheng.dnbcw.info/linux/257411.html [1] 如何编译X86下的 uBuntu APP---非常简单: gcc -o ...
- Linux USB驱动框架分析(2)【转】
转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011 ...
- linux通配符,grep和 egrep区别
其实主要是正则表达式中的一些特殊语法.在网上找的几篇文章,截取相关部分贴在了下面,方便以后翻阅. 参考:http://hi.baidu.com/sei_zhouyu/item/c18e1a950d2e ...