集合操作

序列划分

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;
}
全部评论

相关推荐

#牛客帮帮团来啦!有问必答# 非吹牛逼非炫富,真实向各位大佬求助帖。本人简历上的的公司法人是自己,产品是自己独立开发的,但是担心创业经历会让HR抵触,所以将创业经历优化成实习经历,收入也写少了2/3(隐私信息打码)。进大厂是我中学至今的目标。苦于学历不行,所以决定专注提升履历,大一前便注册了一个高中教育公众号,一年涨了3万粉,月入过万,大学一直是经济独立。大二时攒下来10万,我开始创业做产品,是互联网教育/电商/新媒体等领域,大学三年赚了两百多万,前期是产品空白需求大,现在市场饱和,销量见顶,ROI低到经营困难,数据无法大幅度增长,履历的提升已经出现停滞,无法做出更大的业绩来够到进大厂的门槛。我一开始以为创业是加分项,负债的风险和创业的压力(疫情断货、恶意扣分罚款、背刺、竞对攻击等很多生死存亡的节点都让人焦虑痛苦和失眠)是我不想经历第二次的,因为没有合伙人,只能白天上课,晚上熬夜工作,每天睡5,6小时。没想到创业的经历,会有很多HR怀疑我的求职动机,给我带来很多阻挠。不求工资多少,城市哪里,在职场里发展3-5年以上是我坚定不移的人生规划,只为提高自己未来的下限。所以来到牛客向各位大佬求助。看看简历有什么要优化的,怎么写才有机会进大厂,感激不尽! #投递实习岗位前的准备# #找实习多的是你不知道的事# #实习,投递多份简历没人回复怎么办# #没有实习经历,还有机会进大厂吗#
ITTM:首先给大佬敬礼,然后建议是把工作经历和项目经历挪到最上面,这两个是面试时面试官的谈资,然后教育背景要放在最上面,自我评价一般是放最后的。另外,项目经历按照时间倒序排列,最近做的放在前面
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务