【题解】CF#896 D-Nephren Runs a Cinema
容易发现这些 vip 用户并没什么用,所以考虑枚举手持50元与100元的人共有多少个。设手持50元的人 \(a\) 个,手持100元的人 \(a - k\) 个,那么一共是 \(2*a - k\) 个人,最后手上会剩余 \(k\) 张50元钞票。用卡特兰数计算得到在这种情况下的方案数就是:
\((\binom{2 * a - k}{a} - \binom{2 * a - k}{a + 1}) * \binom{n}{2 * a - k}\)
其中 \(l <= k <= r, 1 <= 2 * a - k <= n\)。
把组合数分开计算,得到答案其实是两部分的和:
\((\binom{2 * a - k}{a} * \binom{n}{2 * a - k}\)
与 \(-\binom{2 * a - k}{a + 1} * \binom{n}{ 2 * a - k}\)
注意到这两个式子均可以化简\(\binom{n}{m} * \binom{m}{r} = \binom{n}{r} * \binom{n - m}{m - r}\),
得到:
\(ans = \binom{n}{a}\binom{n - a}{a - k} - \binom{n}{a + 1} * \binom{n - a - 1}{a - k - 1}\)
分开计算两个部分的和,发现上部分是在计算 \(\sum \binom{n}{a}\binom{n - a}{a - k} (a\in [1, n], k \in [l, r])\)
而下部分则是在计算 \(\sum \binom{n}{a}\binom{n - a}{a - k - 2} (a\in [2, n + 1], k \in [l, r])\)
把中间同样的部分约去即可得到一个 \(O(n)\) 的式子,每一步需求解一个组合数。
然后问题是怎样求出 \(n\) 个对合数取模的组合数?常见思路利用扩展卢卡斯已经不可行,但鉴于此题 \(n\) 比较小,我们可以暴力拆分组合数中的阶乘数。对于与模数互质的部分利用欧拉定理求出逆元,照常处理;不互质的则计算上下约去了多少个质因子后暴力累乘贡献。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200000
#define CNST 30
#define int long long
int n, P, L, R, ans, cnt, fac[maxn], finv[maxn];
int tot, a[maxn], num[maxn][CNST]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Up(int &x, int y) { x = (x + y) % P; if(x < ) x += P; }
int Qpow(int x, int timer, int P)
{
int base = ;
for(; timer; timer >>= , x = x * x % P)
if(timer & ) base = base * x % P;
return base;
} void Pre(int n) {
int x = P, phi = P; fac[] = finv[] = ;
for(int i = ; i * i <= x; i ++)
if(x % i) continue;
else {
phi = phi / i * (i - ); a[++ cnt] = i;
while(!(x % i)) x /= i;
}
if(x > ) phi = phi / x * (x - ), a[++ cnt] = x; for(int i = ; i <= n; i ++) {
int t = i;
for(int j = ; j <= cnt; j ++) {
num[i][j] = num[i - ][j];
while(!(t % a[j])) t /= a[j], num[i][j] ++;
}
fac[i] = fac[i - ] * t % P;
finv[i] = Qpow(fac[i], phi - , P);
}
} int Get_C(int n, int m)
{
int ret = fac[n] * finv[m] % P * finv[n - m] % P, x, y;
if(n < || m < || n < m) return ;
for(int i = ; i <= cnt; i ++)
{
if(a[i] > n) break;
int cnt = num[n][i] - num[m][i] - num[n - m][i];
ret = ret * Qpow(a[i], cnt, P) % P;
}
return ret;
} signed main()
{
n = read(), P = read(), L = read(), R = read();
Pre(n + );
for(int i = ; i <= n; i ++)
{
if(L > i || R < ) continue;
int l = max(L, 0LL), r = min(i, R), t = Get_C(n, i);
Up(ans, P - t * Get_C(n - i + , i - r - ) % P);
Up(ans, t * Get_C(n - i + , i - l) % P);
}
printf("%I64d\n", ans);
return ;
}
【题解】CF#896 D-Nephren Runs a Cinema的更多相关文章
- 【CF896D】Nephren Runs a Cinema 卡特兰数+组合数+CRT
[CF896D]Nephren Runs a Cinema 题意:一个序列中有n格数,每个数可能是0,1,-1,如果一个序列的所有前缀和都>=0且总和$\in [L,R]$,那么我们称这个序列是 ...
- CF896D Nephren Runs a Cinema
CF896D Nephren Runs a Cinema 题意 售票员最开始没有纸币,每次来一个顾客可以给她一张.拿走她一张或不操作.求出不出现中途没钱给的情况 \(n\) 名顾客后剩余钱数在 \(l ...
- CodeForces - 896D :Nephren Runs a Cinema(卡特兰数&组合数学---比较综合的一道题)
Lakhesh loves to make movies, so Nephren helps her run a cinema. We may call it No. 68 Cinema. Howev ...
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T5(思维)
还是dfs? 好像自己写的有锅 过不去 看了题解修改了才过qwq #include <cstdio> #include <algorithm> #include <cst ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- [题解] [CF 1250J] The Parade
题面 题目大意: 给定一个 \(n\) , 所有军人的数量均在 \([1, n]\) 给定 \(a_i\) 代表高度为 \(i\) 的军人的个数 你要将这些军人分成 \(k\) 行, 满足下面两个条件 ...
- 题解 CF 1372 B
题目 传送门 题意 给出 \(n\),输出 \(a\) ,\(b\) (\(0 < a \leq b < n\)),使\(a+b=n\)且 \(\operatorname{lcm}(a,b ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T4(模拟)
随便模拟下就过了qwq 然后忘了特判WA了QwQ #include <cstdio> #include <algorithm> #include <cstring> ...
随机推荐
- Python+Selenium UI自动化测试环境搭建及使用
一什么是Selenium ? Selenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源.免费:多平台.浏览器.多语言支持:对web页面有良好的支持:AP ...
- 错误结果保存示例 - 【jmeter】
- GitHub笔记(五)——忽略文件、配置别名、搭建服务器
六.忽略文件 忽略某些文件时,需要编写.gitignore: .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理! 忽略文件的原则是: 忽略操作系统自动生成的文件,比 ...
- Nginx笔记(一):安装
Nginx在安装前需要先安装其所依赖的类库,所以需先行安装好之后再进行Nginx安装. Nginx依赖以下模块: l gzip模块需要 zlib 库 l rewrite模块需要 pcre 库 l ...
- host命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/xin_y/article/details/53924763 分析域名查询工具,测试域名系统工作是否正常 语法: host ...
- DB2分页查询简单示例
select * from ( select a.* ,rownumber() over(order by create_time desc) as rowid from ( select * fro ...
- final用户体验报告
本次没有新增用户,所联系的用户与beta版本相同 用户序号 用户来源 用户下载软件途径 用户姓名 用户描述(信息) 使用次数 用户评价 1 张恩聚 QQ发送可执行文件 周楠 吉林大学在读研究生 ...
- 第26次Scrum会议(11/14)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...
- 软件工程-东北师大站-第十次作业(PSP)
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- Notes of Daily Scrum Meeting(11.6 and 11.7)
Notes of Daily Scrum Meeting(11.6 and 11.7) 因为七号星期五是放假的第一天,好几名队员要么是出去玩,要么是回家了,所以我们讨论之后在七号没有开始代码的编写, ...