牛客练习赛71 C

数学考试

https://ac.nowcoder.com/acm/contest/7745/C

分析

我们可以假象一个假的限制 记录前 个条件都满足,但第 个条件不满足的方案数,考虑 之间的数随便排列, ,然后第 个条件不满足,前 个条件都满足,乘 ;对于不同的 ,方案是不相交的,且 计算了所有不应该在 中计数到的方案数所以 。思路来源与不知名的大佬。我这里只是分享一下做法。

代码

#include<bits/stdc++.h>
using namespace std;
int read() {
    int x = 0,f = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    return f?-x:x;
}
const int N = 2100,mod = 20000311;
int f[N],p[N],n,m,fac[N];
int main() {
    n = read();m = read();
    fac[0] = 1;
    for(int i = 1;i <= n;i++) fac[i] = 1LL * fac[i-1] * i % mod;
    for(int i = 1;i <= m;i++) p[i] = read();
    p[++m] = n;sort(p+1,p+1+m);
    for(int i = 1;i <= m;i++) {
        f[i] = fac[p[i]];
        int res = 0;
        for(int j = 1;j < i;j++) {
            res = (res + 1LL * fac[p[i] - p[j]] * f[j]) % mod;
        }
        f[i] = ((f[i] - res) % mod + mod) % mod;
    }
    cout << f[m] << endl;
    return 0;
}
比赛题解 文章被收录于专栏

近期比赛的题解应该有吧。。。

全部评论

相关推荐

点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务