【NOI P模拟赛】(要素过多的标题)(容斥原理)
题面
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模拟赛】(要素过多的标题)(容斥原理)的更多相关文章
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- noi.acNOIP模拟赛5-count
题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...
- 【XJOI】【NOI考前模拟赛7】
DP+卡常数+高精度/ 计算几何+二分+判区间交/ 凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……( ...
- 2018/3/13 noiρ[rəʊ]模拟赛 125分
T1 60分暴力,水分也不会水,打表也不会打,正解是不可能写正解的,这辈子都写不出来正解的,虽然是zz题但是也拿不到分这样子. 正解:(啥?正解是sb组合数?这都他娘的想不到,真鸡儿丢人我自杀吧.) ...
- NOI.ac模拟赛20181021 ball sequence color
T1 ball 可以发现每次推动球时,是将每个球的位置 −1-1−1 ,然后把最左边的球放到 P−1P-1P−1 处. 记个 −1-1−1 次数,再用set维护就好了. #include <bi ...
- 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 ...
- 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 ...
- Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)
题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...
随机推荐
- 【spring源码系列】之【FactoryBean类型的接口】
1.概述 目前我们知道,spring创建bean有多种方式,比如xml方式创建,比如@Component,@Service,@Controler,@Repository注解创建,比如@Autowire ...
- C#实现[移除文件名中的非中文字符]
更新记录: 2022年5月28日 从程序中抽出方法复用. 处理财务文件时写的一个小函数.用于移除文件名中的非中文字符. /// <summary> /// 移除文件名中的非中文字符 /// ...
- 腾讯视频的qlv格式转换为mp4格式
1.点击设置->下载设置->缓存管理 下的文件目录复制; 2复制在 我的电脑路径栏目中 找到缓存目录 文件夹vodcache; 3.打开视频对应文件; 4.打开cmd命令窗口 5.跳转 到 ...
- linux-基于tensorflow2.x的手写数字识别-基于MNIST数据集
数据集 数据集下载MNIST 首先读取数据集, 并打印相关信息 包括 图像的数量, 形状 像素的最大, 最小值 以及看一下第一张图片 path = 'MNIST/mnist.npz' with np. ...
- 手把手教你用 Python 下载手机小视频
今天为大家介绍使用 mitmproxy 这个抓包工具如何监控手机上网,并且通过抓包,把我们想要的数据下载下来. 启动 mitmproxy 首先我们通过执行命令 mitmweb 启动mitmproxy, ...
- Educational Codeforces Round 128 (Rated for Div. 2) A-C+E
Educational Codeforces Round 128 (Rated for Div. 2) A-C+E A 题目 https://codeforces.com/contest/1680/p ...
- Kotlin学习快速入门(7)——扩展的妙用
原文地址: Kotlin学习快速入门(7)--扩展的妙用 - Stars-One的杂货小窝 之前也模模糊糊地在用这个功能,也是十分方便,可以不用继承,快速给某个类增加新的方法,本篇便是来讲解下Kotl ...
- JavaWeb连接MySQL数据库
JavaWeb连接MySQL数据库 JavaWeb连接MySQL数据库的方式有很多,首先我们讲解JDBC的配置方法 一.JDBC的配置方法 1.什么是JDBC 什么是JDBC嘞?JDBC代表Java数 ...
- 地址解析协议(ARP) 分析
什么是ARP协议 ARP(A ddress R esolution P rotocol)- 地址解析协议 ,用于将IP地址解析为MAC地址.复杂来说,ARP用于32位IPv4地址和以太网的48位MAC ...
- Mybatis源码解读-配置加载和Mapper的生成
问题 Mybatis四大对象的创建顺序? Mybatis插件的执行顺序? 工程创建 环境:Mybatis(3.5.9) mybatis-demo,参考官方文档 简单示例 这里只放出main方法的示例, ...