集合操作

序列划分

https://ac.nowcoder.com/acm/contest/7413/A

题目描述
有一个集合 S,初始为 {1, 2, 3, \dots, n}{1,2,3,…,n}。
接下来会进行若干次操作,每次操作如下:
选择一个整数 x \in Sx∈S,满足 S 中小于 x 的元素不超过 m 个。然后在 S 中删除 x。
求出通过以上操作能够得到多少种不同的集合 S 。
答案对 998244353 取模。
思路:

  1. 容易得出,所有的情况一共有图片说明 种。所以我们只需要求出不存在的情况有几种。
    不存在的情况:
    容易知道我们每一次可以从当前左边的m+1中选取一个。
    当我们减少0个数字的时候,右边n-m-1个只要有任意一个数字减少都是一种不存在的情况。这种情况就有图片说明 种。(-1的原因是因为他们全都存在,也就是不选的时候的情况)

当成功减少1个数字的时候,右边n-m-2个只要有任意一个数字减少都是一种不存在的情况。这种情况就有图片说明 (C(m+1,-1))代表的是成功删除掉一个数字的情况)

以此类推当成功减少2个数字的时候为图片说明
....

当右边数字为1个的时候停下,为1个的时候左边还剩下m个,总的个数为m+1,所有的情况都能得到
AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
#ifdef ONLINE_JUDGE
#else
#define scanf scanf_s
#endif // ONLINE_JUDGE
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define ROF(i,a,b) for(int i = a;i >= b;i--)
const ll mod = 998244353;
const int maxx = 1e5 + 10;
ll jc[maxx];
ll poww(ll a, ll b, ll mod) {
    ll base = 1;
    while (b) {
        if (b & 1) { base = base * a % mod; }
        b >>= 1; a = a * a % mod;
    }
    return base;
}
ll C(ll n, ll m) {
    if (m == 0) return 1;
    ll fenzi = jc[n];
    //ll fenmu = jc[n - m] * jc[m] % mod;
    return fenzi * poww(jc[n - m], mod - 2, mod) % mod * poww(jc[m], mod - 2, mod) %mod;
}
ll read() {
    ll X = 0, w = 1; char c = getchar();
    while (c < '0' || c>'9') { if (c == '-') w = -1; c = getchar(); }
    while (c >= '0' && c <= '9') X = X * 10 + c - '0', c = getchar();
    return X * w;
}
int main() {
    jc[0] = 1;
    ll n, m; n = read(), m = read();
    FOR(i, 1, n) jc[i] = jc[i - 1] * i % mod;
    ll total = poww(2, n, mod);
    ll less = 0;
    for (int r = n - m - 1,l = 0; r > 0; r--,l++) {
        less = (less + C(m + l, l) * (poww(2, r, mod) - 1) % mod) %mod;
    }
    cout << (total - less + mod) % mod<< endl;
}
全部评论

相关推荐

正在干活结果人事过来找我,说我被裁了,还说要裁一半,一些没转正的先踢出去…&nbsp;真是牛逼现在的公司,怪不得越做越小。上个月初提交的转正申请,我老大也同意了,我真以为我转正了,结果人事跟我说我老大不知道这些,好吧那你们瞒着呗真是逆天…&nbsp;又要开始找工作了,现在工作哪里这么好找,还有这么多公司喜欢这种操作,坑我们应届生真服了👿
CoderEcho:看你的主页,你好像是有点内向,不怎么说话?我之前实习也是这样的,hr和主管也是用我太内向导致的主管看不到头,工作习惯不好,不适合他们这样的原因把我实习劝退,但是公司肯定有公司的问题,因为去年没一个实习转正的,连社招生都劝退。倒也不是替公司说话,只是一些建议,公司内部裁员肯定是公司的问题,只是积极主动(或者领导眼中积极主动)的人未来一定会有更多机会,刚被劝退的时候基本上秋招已经结束,但是1月份的时候还是上岸啦,并且面试时我说出了我对积极主动的理解也是加分的一点。祝你继续加油往前走,大厂经历+985学历,结果一定不会差的啦
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务