首页 > 其他分享 >CF1946E 题解

CF1946E 题解

时间:2024-03-23 09:12:53浏览次数:22  
标签:return read 题解 long CF1946E fac getchar mod

Blog


赛场上差一点做出来。

首先发现左右两部分是比较独立的,所以可以分开计算后合并。

注意到我们可以把整个数集分成左右两部分,即 \(\binom{n - 1}{p_{m1} - 1}\)。

然后我们不妨只考虑左边。

发现左边的最大值也已经确定,且最大值右边的所有数可以随便选,即 \(\binom{p_{i + 1} - 2}{p_i - 1}\)。

由于内部需要换顺序,所以还要乘上 \((p_{i + 1} - p_i - 1)!\)。

右边同理。最后的答案即为全部的乘积。

/*******************************
| Author:  DE_aemmprty
| Problem: E. Girl Permutation
| Contest: Codeforces Round 936 (Div. 2)
| URL:     https://codeforces.com/contest/1946/problem/E
| When:    2024-03-22 22:37:51
| 
| Memory:  256 MB
| Time:    2000 ms
*******************************/
#include <bits/stdc++.h>
using namespace std;

long long read() {
    char c = getchar();
    long long x = 0, p = 1;
    while ((c < '0' || c > '9') && c != '-') c = getchar();
    if (c == '-') p = -1, c = getchar();
    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x * p;
}

const int N = 2e5 + 7;
const long long mod = 1e9 + 7;

int n, m1, m2;
int p[N], q[N];
long long fac[N];

long long ksm(long long x, long long y) {
    long long res = 1;
    for (; y; y >>= 1, (x *= x) %= mod)
        if (y & 1)
            (res *= x) %= mod;
    return res;
}

long long C(long long x, long long y) {
    if (x < y) return 0;
    return fac[x] * ksm(fac[y] * fac[x - y] % mod, mod - 2) % mod;
}

void solve() {
    n = read(), m1 = read(), m2 = read();
    for (int i = 1; i <= m1; i ++) p[i] = read();
    for (int i = 1; i <= m2; i ++) q[m2 - i + 1] = n - read() + 1;
    if (p[m1] + q[m2] != n + 1 || p[1] != 1 || q[1] != 1) {
        cout << 0 << '\n';
        return ;
    }
    long long res = 1ll;
    for (int i = 1; i < m1; i ++) {
        int siz = p[i + 1] - p[i] - 1;
        res = res * fac[siz] % mod * C(p[i + 1] - 2, p[i] - 1) % mod;
    }
    long long res2 = 1ll;
    for (int i = 1; i < m2; i ++) {
        int siz = q[i + 1] - q[i] - 1;
        res2 = res2 * fac[siz] % mod * C(q[i + 1] - 2, q[i] - 1) % mod;
    }
    cout << res * res2 % mod * C(n - 1, p[m1] - 1) % mod << '\n';
}

signed main() {
    int t = 1;
    t = read();
    fac[0] = 1;
    for (int i = 1; i <= 200000; i ++) fac[i] = fac[i - 1] * i % mod;
    while (t --) solve();
    return 0;
}

标签:return,read,题解,long,CF1946E,fac,getchar,mod
From: https://www.cnblogs.com/yh2021shx/p/18090768

相关文章

  • CF1948G MST with Matching 题解
    洛谷题面CF题面题目要求一个最小值加上一个最大值的最小值,不好直接做,考虑转化。发现树是二分图,而由柯尼希定理可知二分图的最大匹配等于其最小点覆盖。这样就把求\(\min(\min_{\text{生成树}}+\max_{匹配})\)转化为了\(\min(\min_{生成树}+\min_{覆盖})\)。直接\(\math......
  • CF1618G Trader Problem 题解
    题目链接:CF或者洛谷本题挺有意思的,我们观察到\(\lek\)这个限制使得我们可以将原序列进行分组,把\(\lek\)的限制的元素放在一组中,那么根据题意,这组当中任意元素之间都是可以互相交换的,包括系统用品。那么假设一组中有\(x\)个自身的物品,\(y\)个系统物品,那么这\(x+y\)物......
  • uni-app/小程序自定义导航栏下拉刷新loading图标看不到问题解决
    实际效果图 我们在page.json中开启了自定义导航栏属性和下拉刷新属性后//开启下拉刷新"enablePullDownRefresh":true//自定义导航栏"navigationStyle":"custom"此时,页面中的下拉刷新三个小圆点会被我们的导航栏遮盖住,导致用户下拉刷新看不到loading效果,如下图:......
  • 20240322每日一题题解
    20240322每日一题题解Problem输入\(n\)个不大于\(10^5\)的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。第一行输入一个正整数\(n\),表示整数个数。第二行输入\(n\)个正整数\(a_i\),以空格隔开。输出一行,依次输出\(a_i\)中剩余的质数,以空格......
  • SQL的nvarchar类型的中文内容,显示有乱码问题解决
    今天上线一个ASP项目升级为MVC的项目。原系统的ASP语言保存到SQLserver中nvarchar字段内容显示乱码了(显示有&#代码)。下图是SQLmanagementstudio的结果截图:左1列是经修正转化的可正常显示右1列OriStr为原数据库中nvarchar的内容。(ASP程序保存到数据库的原始数据)【产生乱......
  • 洛谷 P1379 八数码难题 A* 题解
    刚做完一道模板A*,看到这题我直接小脑萎缩了...阿米诺斯!这怎么用A*?!——刚开题的我beeeeeeeeeelike甚至比模板简单(这是绿的...)其实会是会但是纸张的是这玩意我不会搞估价函数我草!然后突然想到能不能把这个状态下有多少个数字不在目标位置作为估价函数?我喜欢\(IDA*\),有兴趣......
  • iOS应用审核问题解决方案及优化方法 ✨
     摘要本文将针对iOS应用提交审核时可能遇到的问题,如“你必须在Xcode中添加com.apple.developer.game-center密钥”,以及突然间提交送审报错情况进行探讨。通过大量查询资料和尝试,结合案例分析,提供了解决方案和优化方法,帮助开发者成功通过应用商店审核。 引言在iOS应用开发......
  • UVA557 Burger 题解
    UVA557Burger题目大意称一个长度为\(n\)的01串是好的,当且仅当\(0\)和\(1\)在该串中分别出现恰好\(\fracn2\)次,且该串的最后两位相同。现给定\(n\)(\(n\)为偶数),求该串是好的的概率。Solve正难则反,考虑求出最后两位不同的概率。令\(m=\fracn2\),那么条件“最后......
  • 一次性搞定!思源字体安装、使用及常见问题解答
    环境Windows11Pro23H2Microsoft365Word2402思源宋体:v2.002思源黑体:v2.0041.结论本人非专业字体工作者,个人建议,仅供参考;先说结论,链接以及详细说明见后文安装SC版本,无其余后缀HW,VF,CN等关于HW,思源宋体没有HW版本,个人实测,非HW版本,英文数字采用比例......
  • AcWing 1230. K倍区间 C++满分题解
    原题链接https://www.acwing.com/problem/content/1232/题目分析求区间和,我们可以通过前缀和来求出。我们规定sum[i]表示第1个元素到第i个元素的和。那么sum[r]-sum[l-1]就是区间[l,r]的和。一维前缀和for(inti=1;i<=n;i++){scanf("%lld",&sum[i]);......