题面

0 题目背景

[




]

_{^{[数\,据\,删\,除]}}

[数据删除]​

1 题目描述

在执行任务时,收集到了

n

n

n 份能源,其中第

i

i

i 份的能量值是

w

i

w_i

wi​ ,她决定将它们分成恰好

k

k

k 组带回基地,每一组都要有至少

1

\tt1

1 份能源。

每一组能源会对运输设备产生负荷值,若该组有

x

x

x 份能源,这

x

x

x 份能源能量值之和为

y

y

y , 则产生的负荷值为

x

×

y

x × y

x×y 。

每种分组方案产生的负荷是每一组能源产生的负荷值总和,想知道所有可能的分组方案产生的负荷之和对

998244353

\tt998244353

998244353 取模的结果。

2 输入格式

输入文件 ichigo.in 包含 2 行。

第 1 行输入两个正整数分别表示

n

,

k

n, k

n,k 。

第 2 行输入

n

n

n 个正整数,其中第

i

i

i 个正整数表示

w

i

w_i

wi​ 。

3 输出格式

输出文件 ichigo.out 包含一行,仅一个非负整数,表示答案对

998244353

\tt998244353

998244353 取模的结果。

题解

翻译一下,第

i

i

i 份能源的贡献为(所有情况下【

i

i

i 所在的组的大小】之和)×

w

i

w_i

wi​ 。

然后这个括号里的(所有情况下【

i

i

i 所在的组的大小】之和),对于每个

i

i

i 来说地位是等同的,所以我们求的最终答案就是(所有情况下【一号所在的组的大小】之和)×

w

i

\sum w_i

∑wi​ 。

我们令( 所有情况下【一号所在的组的大小】之和)为

a

s

as

as 。

首先我们发现,分成

k

k

k 组是无序的,不好办,我们就先让他有序,给每一组一个

1

k

1\sim k

1∼k 的标号,答案除去

k

!

k!

k! 就行了。(这里,不少人会选择【斯特林数】推导,但是这并不方便计算我们的目标)

然后,就可以将

n

n

n 份能源放入

k

k

k 个桶中,统计每份能源与一号能源碰面的概率之和,再乘上总方案数,就能求出 不强制每个桶非空 的答案了:

(

1

k

(

n

1

)

+

1

)

k

n

(\frac{1}{k}\cdot(n-1)+1)\cdot k^n

(k1​⋅(n−1)+1)⋅kn

接下来用容斥,我们令条件

A

i

A_i

Ai​ 为桶

i

i

i 非空,求所有条件都满足的答案。

可得

a

s

=

i

=

1

k

(

1

)

k

i

(

(

1

i

(

n

1

)

+

1

)

i

n

)

(

k

i

)

k

!

as=\frac{\sum_{i=1}^k(-1)^{k-i} \left(\Big(\frac{1}{i}(n-1)+1\Big)\cdot i^n \right)\cdot {k\choose i}}{k!}

as=k!∑i=1k​(−1)k−i((i1​(n−1)+1)⋅in)⋅(ik​)​

即最终答案为

(

w

i

)

i

=

1

k

(

1

)

k

i

(

(

1

i

(

n

1

)

+

1

)

i

n

)

(

k

i

)

k

!

(\sum w_i)\cdot\frac{\sum_{i=1}^k(-1)^{k-i} \left(\Big(\frac{1}{i}(n-1)+1\Big)\cdot i^n \right)\cdot {k\choose i}}{k!}

(∑wi​)⋅k!∑i=1k​(−1)k−i((i1​(n−1)+1)⋅in)⋅(ik​)​

时间复杂度

O

(

n

log

n

)

O(n\log n)

O(nlogn) 。

瓶颈在于求

1

k

1\sim k

1∼k 的

n

n

n 次方用了快速幂,可以用线性筛优化至

O

(

n

)

O(n)

O(n) 。

CODE

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <random>
#include <vector>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 1000005
#define LL long long
#define DB double
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
#define FI first
#define SE second
int xchar() {
static const int maxn = 1000000;
static char b[maxn];
static int len = 0, pos = 0;
if (pos == len)
pos = 0, len = fread(b, 1, maxn, stdin);
if (pos == len)
return -1;
return b[pos++];
}
//#define getchar() xchar()
LL read() {
LL f = 1, x = 0;
int s = getchar();
while (s < '0' || s > '9') {
if (s < 0)
return -1;
if (s == '-')
f = -f;
s = getchar();
}
while (s >= '0' && s <= '9') {
x = x * 10 + (s ^ 48);
s = getchar();
}
return f * x;
}
void putpos(LL x) {
if (!x)
return;
putpos(x / 10);
putchar('0' + (x % 10));
}
void putnum(LL x) {
if (!x) {
putchar('0');
return;
}
if (x < 0) {
putchar('-');
x = -x;
}
return putpos(x);
}
void AIput(LL x, int c) {
putnum(x);
putchar(c);
} const int MOD = 998244353;
int n, m, s, o, k;
int qkpow(int a, int b) {
int res = 1;
while (b > 0) {
if (b & 1)
res = res * 1ll * a % MOD;
a = a * 1ll * a % MOD;
b >>= 1;
}
return res;
}
int fac[MAXN], inv[MAXN], invf[MAXN];
int C(int n, int m) {
if (m < 0 || m > n)
return 0;
return fac[n] * 1ll * invf[n - m] % MOD * invf[m] % MOD;
}
int dp[MAXN];
int main() {
freopen("ichigo.in", "r", stdin);
freopen("ichigo.out", "w", stdout);
n = read();
k = read();
fac[0] = fac[1] = inv[0] = inv[1] = invf[0] = invf[1] = 1;
for (int i = 2; i <= n; i++) {
fac[i] = fac[i - 1] * 1ll * i % MOD;
inv[i] = (MOD - inv[MOD % i]) * 1ll * (MOD / i) % MOD;
invf[i] = invf[i - 1] * 1ll * inv[i] % MOD;
}
int ans = 0;
for (int i = 1; i <= n; i++) (ans += read()) %= MOD;
for (int i = 1; i <= k; i++) {
int al = qkpow(i, n);
dp[i] = (inv[i] * 1ll * (n - 1) % MOD + 1) * 1ll * al % MOD;
}
int as = 0;
for (int i = k, l = 1; i > 0; i--, l = MOD - l) {
(as += l * 1ll * dp[i] % MOD * 1ll * C(k, i) % MOD) %= MOD;
}
as = as * 1ll * invf[k] % MOD;
ans = ans * 1ll * as % MOD;
AIput(ans, '\n');
return 0;
}

【NOI P模拟赛】(要素过多的标题)(容斥原理)的更多相关文章

  1. [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)

    (2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...

  2. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  3. noi.acNOIP模拟赛5-count

    题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...

  4. 【XJOI】【NOI考前模拟赛7】

    DP+卡常数+高精度/  计算几何+二分+判区间交/  凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……( ...

  5. 2018/3/13 noiρ[rəʊ]模拟赛 125分

    T1 60分暴力,水分也不会水,打表也不会打,正解是不可能写正解的,这辈子都写不出来正解的,虽然是zz题但是也拿不到分这样子. 正解:(啥?正解是sb组合数?这都他娘的想不到,真鸡儿丢人我自杀吧.) ...

  6. NOI.ac模拟赛20181021 ball sequence color

    T1 ball 可以发现每次推动球时,是将每个球的位置 −1-1−1 ,然后把最左边的球放到 P−1P-1P−1 处. 记个 −1-1−1 次数,再用set维护就好了. #include <bi ...

  7. NOI.ac 模拟赛20181103 排队 翘课 运气大战

    题解 排队 20% 1≤n≤20,1≤x,hi≤201\le n\le 20, 1\le x,h_i\le 201≤n≤20,1≤x,hi​≤20 随便暴力 50% 1≤n≤2000,1≤x,hi≤1 ...

  8. Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化

    其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2​优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...

  9. Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)

    题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...

随机推荐

  1. jenkins 流水线自动化部署 手动下载安装插件包

    如果有些插件不能通过可选插件安装,可以进行选择高级并上传插件包,插件包链接地址为:http://updates.jenkins-ci.org/download/plugins/ 同时在高级中可以更换下 ...

  2. RMQ——ST表

    ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] ...

  3. 论文解读(MGAE)《MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs》

    论文信息 论文标题:MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs论文作者:Qiaoyu Tan, Ninghao L ...

  4. Java开发学习(六)----DI依赖注入之setter及构造器注入解析

    一.DI依赖注入 首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法) 构造方法 依赖注入描述了在容器中建立bean与bean之间的依赖关 ...

  5. 再测云原生数据库性能:PolarDB依旧最强,TDSQL-C、GaussDB变化不大

    1.摘要 近期,腾讯云数据库在文章「腾讯云TDSQL-C重磅升级,性能全面领跑云原生数据库市场」中提到,某些场景下性能有非常大的提升,且超过国内某橙色云厂商.恰好,在5月份,我们对各个厂商的云原生数据 ...

  6. 【RocketMQ】消息的存储

    Broker对消息的处理 BrokerController初始化的过程中,调用registerProcessor方法注册了处理器,在注册处理器的代码中可以看到创建了处理消息发送的处理器对象SendMe ...

  7. Collection集合概述和集合框架介绍avi

    集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢?· ~集合︰集合是java中提供的一种容器,可以用来存储多个数据集合和数组既然都是容器,它 ...

  8. DNS 系列(三):如何免受 DNS 欺骗的侵害

    互联网上每一台设备都会有一个 IP 地址,我们在访问网站或发送信息时,其实都是通过 IP 地址达成准确请求的.但是这个 IP 地址由很长一串数字组成,记忆起来相当困难,所以我们创造了更实用的域名来代替 ...

  9. 关于 Flink 状态与容错机制

    Flink 作为新一代基于事件流的.真正意义上的流批一体的大数据处理引擎,正在逐渐得到广大开发者们的青睐.就从我自身的视角看,最近也是在数据团队把一些原本由 Flume.SparkStreaming. ...

  10. IDEA 开发工具-插件{[转载]

    00 idea 开发工具使用技巧 01 idea插件推荐-- 02 IDEA插件 03 IDEA值得推荐的20款优秀的插件 04 IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图