Description

DLS 有 \(N\) 个花田,每个花田里有 \(a_i\) 朵花。

DLS 喜欢稀奇古怪的花田,他希望重新排列花田,然后去采花。

但 DLS 采花又有一个癖好:他会从左往右采花。

若当前采到第 \(i\) 个花田,在之前有一个花田的花的数量,是第 \(i\) 个花田的花的数量的因子的话,那么 DLS 不会采这个花田的花。

现在,DLS 想知道对于所有排列花田的方案,他能够采到的花的数量的和是多少。

由于答案会比较大,请对 \(998244353\) 取模。

Input

第一行是一个整数 \(N\)

下面一行 \(N\) 个整数代表这个序列

Output

输出答案对 \(998244353\) 取膜的结果

Hint

\(for~50~percents:N~\leq~9\)

\(for~80~percent:N~\leq~1000\)

\(forall:1~\leq~N~\leq~10^5,1~\leq~10^5\)

Solution

感觉所有的题解都没有写部分分和式子是怎么用数学方法推出来的啊qwq

考虑前50分,直接枚举全排列检验,时间复杂度 \(O(n!~\times~n^2)\),期望得分50pts。

考虑前80的数据,我们发现问题等价于求\(\sum_{i = 1}^n a_i ~ \times~\text{序列中所有}a_i\text{的因数都在}a_i\text{的后面的方案数}\)。问题转化为如何求出方案数。

对于每个 \(a_i\),我们考虑枚举他在产生贡献方案中的位置。设 \(a_i\) 除去他自身共有 \(k\) 个因数在序列中。

当 \(a_i\) 放在倒数第 \(k + 1\) 位置上时,后面 \(k\) 个因数随便放,前面的所有数字随便放,所以方案数为 \(k!~\times~(n - k - 1)!\)

当 \(a_i\) 放在倒数第 \(k + 2\) 位置上时,后面 \(k\) 个因数和随便一个非因数随便放,前面剩下的数字随便放。由于非因数是随便选的,所以方案数为 \((k + 1)!~\times~(n - k - 2)!~\times~C_{n - k - 1}^{1}\)

当 \(a_i\) 放在倒数第 \(k + 3\) 位置上时,后面 \(k\) 个因数和随便两个非因数随便放,前面剩下的数字随便放。由于非因数是随便选的,所以方案数为 \((k + 2)!~\times~(n - k - 3)!~\times~C_{n - k - 1}^{2}\)

一位读者砸烂了复读机停止了复读

依此做数学归纳,可得答案即为

\[\sum_{i = k}^{n - 1} i!~\times~(n - i + 1)!~\times~C_{n - k - 1}^{i - k}
\]

相当于枚举 \(a_i\) 在倒数第 \(i + 1\) 位时的答案。

发现这个式子sigma后面可以在预处理阶乘和逆元后 \(O(1)\) 计算,整个sigma可以 \(O(n)\) 计算,一共算 \(n\) 次,于是总复杂度 \(O(n^2)\),期望得分80pts。

考虑全部的数据,我们发现上面先枚举 \(a_i\) 的位置再枚举因数怎么放的多余的,可以直接把他们放在一起枚举:我们在一个序列中选择 \((k + 1)\) 个位置,其中第一个位置放 \(a_i\),其他位置放因数,剩下的位置随便放,于是答案即为

\[C_{n}^{k + 1}~\times~k!~\times~(n - k - 1)!
\]

这个式子在预处理后可以 \(O(1)\) 计算,于是算上求因数后总复杂度 \(O(n~\sqrt a)\),期望得分100pts。

Code

#include <cstdio>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#define printtime()
#else
#include <ctime>
#define printtime() printf("Times used = %ld ms\n", clock())
#endif
#define ci const int
#define cl const long long typedef long long int ll; namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if (front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if (front == end) return -1;
}
return *(front++);
}
} template <typename T>
inline void qr(T &x) {
char ch = IPT::GetChar(), lst = ' ';
while ((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while ((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if (lst == '-') x = -x;
} namespace OPT {
char buf[120];
} template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if (x < 0) {x = -x, putchar('-');}
int top=0;
do {OPT::buf[++top] = static_cast<char>(x % 10 + '0');} while (x /= 10);
while (top) putchar(OPT::buf[top--]);
if (pt) putchar(aft);
} const int maxn = 100010;
const int MOD = 998244353; int n;
int MU[maxn], bk[maxn];
ll ans;
ll fact[maxn], inv[maxn], finv[maxn]; ll C(int, int); int main() {
freopen("1.in", "r", stdin);
qr(n);
for (int i = 1; i <= n; ++i) {
qr(MU[i]); ++bk[MU[i]];
}
fact[0] = finv[0] = inv[1] = 1;
for (int i = 2; i <= n; ++i) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i % MOD, finv[i] = finv[i - 1] * inv[i] % MOD;
for (int i = 1; i <= n; ++i) {
int _cnt = 0;
int j;
for (j = 1; (j * j) < MU[i]; ++j) if (!(MU[i] % j)) _cnt += bk[j] + bk[MU[i] / j];
if ((j * j) == MU[i]) _cnt += bk[j];
--_cnt;
ans = (ans + C(n, _cnt + 1) * fact[_cnt] % MOD * fact[n - _cnt - 1] % MOD * MU[i]) % MOD;
}
qw((ans + MOD) % MOD, '\n', true);
printtime();
} ll C(int x, int y) {
return fact[x] * finv[y] % MOD * finv[x - y] % MOD;
}

【组合数学】【P5216】DLS采花的更多相关文章

  1. [洛谷P5216]DLS 采花

    题目大意:有$n$个数,任意排列,排列后第$i$个数会产生贡献当且仅当$1\sim i-1$中的数不是它的因子,问所有排列的贡献和 题解:发现一个数要产生贡献要求所有它的因子在它的右边,设有$cnt_ ...

  2. BZOJ 2743 【HEOI2012】 采花

    题目链接:采花 这道题一眼看去,一个很显然的想法就是莫队.但是数据范围是\(10^6\)级别的,莫队显然已经过不去了. 其实感觉这道题和以前写过的一道题HH的项链很像.只不过那道题要求的是区间出现次数 ...

  3. 【HEOI2012】采花 BZOJ2743

    Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...

  4. 采花 bzoj 2743

    采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整 ...

  5. BZOJ 2743: [HEOI2012]采花

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 2056  Solved: 1059[Submit][Status ...

  6. [bzoj2743][HEOI2012]采花(树状数组+离线)

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 1832  Solved: 954[Submit][Status] ...

  7. cdoj 1489 老司机采花

    地址:http://acm.uestc.edu.cn/#/problem/show/1489 题目: 老司机采花 Time Limit: 3000/1000MS (Java/Others)     M ...

  8. 数据结构(树状数组):HEOI2012 采花

    [题目描述] 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便 ...

  9. BZOJ 2743: [HEOI2012]采花( 离线 + BIT )

    处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...

随机推荐

  1. ES6----Proxy(一)

    Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. 听起来好像很绕,可以简单这样理解,Proxy相当于 ...

  2. 快速删除docker中的容器

    http://blog.csdn.net/cmzsteven/article/details/49230363

  3. 互评Alpha作品——Hello World!团队作品空天猎

    基于NABCD评论作品 1.Need需求:市面上同类型的手机及PC端飞行射击类游戏有很多,所以从需求方面来说,这款游戏的潜在客户非常有局限性.近些年较火的飞行射击类游戏,例如腾讯14年发行的<全 ...

  4. “Hello World!”团队第六周第六次会议

    “Hello World!”团队第六周第六次会议   博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout& ...

  5. 团队项目开题Scrum Meeting报告

    团队项目开题Scrum Meeting报告 在10月30号星期四的晚上我们团队找到了给我们代码的王翊学长,由学长给我们讲解了他编写IOS平台上北航MOOC系统的架构和思路, 因为我们团队没有苹果公司的 ...

  6. t团队项目计划

    团队的backlog: .用户登录网站后,可以选择是买或者卖, (1)买 点击链接,可以分类浏览商品信息,也可以按价钱筛选 (2)卖 点击链接,选择要挂出的商品种类,填写信息(名称.价格.数量等)接着 ...

  7. 《Spring2之站立会议8》

    <Spring2之站立会议8> 昨天,添加了登录界面: 今天,准备添加注册界面: 遇到的问题:过程中遇到了一些困难,不过还是解决了.

  8. “吃神么,买神么”的第一个Sprint计划(第五天)

    “吃神么,买神么”项目Sprint计划 ——5.25  星期一(第五天)立会内容与进度 摘要:logo2出来了,修改过不一样的风格,组内总体评价可以,但是颜色要改,色调没注意,统一决定改成与背景色一致 ...

  9. MIT挑战(如何在12个月内自学完成MIT计算机科学的33门课程|内附MIT公开课程资源和学习顺序

    译者注:本文译自Scott H. Young的博客,Scott拥有超强的学习能力,曾在12个月内自学完成麻省理工学院计算机科学的33门课程.本文就是他个人对于这次MIT挑战的介绍和总结. 版权声明:本 ...

  10. 08_Java基础语法_第8天(Eclipse)_讲义

    今日内容介绍 1.Eclipse开发工具 2.超市库存管理系统 01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...