Description:


\(n<=10,max(w)<=1e6\)

题解:


考虑暴力,相当于走多维格子图,不能走有些点。

套路就是设\(f[i]\)表示第一次走到i的方案数

\(f[i]=起点到点i的方案数-\sum_{j在i前面}f[j]*j到i的方案数\)

不妨把前缀和后缀的分开,设为f和g。

f上的点形如(i,i,…)

设\(m=min(w)\),\(w-=m\)

则g上的点形如(w+i,……)

这样就顺序了。

且\(i->j的方案数\)之和坐标差有关,那就可以分治NTT了。

还可以优化,设\(f->f的转移多项式是A,f->g是B,g->f是C\)

则有

\(F=A-F*A-G*C\)

\(G=B-G*A-F*B\)

最后答案就是\(G[m]\)

消元可得:

\(G={B \over (1+A)^2-BC}\)

所以求逆即可。

Code:


#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std; const int mo = 998244353; ll ksm(ll x, ll y) {
ll s = 1;
for(; y; y /= 2, x = x * x % mo)
if(y & 1) s = s * x % mo;
return s;
} typedef vector<ll> V;
#define pb push_back
#define si size() const int nm = 1 << 21;
namespace ntt {
ll w[nm], a[nm], b[nm]; int r[nm];
void build() {
for(int i = 1; i < nm; i *= 2) {
ll v = ksm(3, (mo - 1) / 2 / i);
w[i] = 1; ff(j, 1, i) w[i + j] = w[i + j - 1] * v % mo;
}
}
void dft(ll *a, int n, int f) {
ff(i, 0, n) {
r[i] = r[i / 2] / 2 + (i & 1) * (n / 2);
if(i < r[i]) swap(a[i], a[r[i]]);
} ll b;
for(int i = 1; i < n; i *= 2) for(int j = 0; j < n; j += 2 * i)
ff(k, 0, i) b = a[i + j + k] * w[i + k], a[i + j + k] = (a[j + k] - b) % mo, a[j + k] = (a[j + k] + b) % mo;
if(f == -1) {
reverse(a + 1, a + n);
b = ksm(n, mo - 2);
ff(i, 0, n) a[i] = (a[i] + mo) * b % mo;
}
}
void fft(V &p, V &q) {
int p0 = p.si + q.si - 1, n = 1;
for(; n < p0; n *= 2);
ff(i, 0, n) a[i] = b[i] = 0;
ff(i, 0, p.si) a[i] = p[i];
ff(i, 0, q.si) b[i] = q[i];
dft(a, n, 1); dft(b, n, 1);
ff(i, 0, n) a[i] = a[i] * b[i] % mo;
dft(a, n, -1);
p.resize(p0);
ff(i, 0, p0) p[i] = a[i];
}
} V operator * (V p, V q) {
ntt :: fft(p, q);
return p;
}
void dft(V &p, int f) {
ff(i, 0, p.si) ntt :: a[i] = p[i];
ntt :: dft(ntt :: a, p.si, f);
ff(i, 0, p.si) p[i] = ntt :: a[i];
}
V qni(V a) {
int a0 = a.si, n0 = 1;
while(n0 < a0) n0 *= 2;
V b; b.resize(1); b[0] = ksm(a[0], mo - 2);
for(int n = 2; n <= n0; n *= 2) {
V d = b; d.resize(n); b.resize(2 * n);
V c = a; c.resize(n); c.resize(2 * n);
dft(c, 1); dft(b, 1);
ff(i, 0, b.si) b[i] = c[i] * b[i] % mo * b[i] % mo;
dft(b, -1); b.resize(n);
ff(i, 0, b.si) b[i] = (2 * d[i] - b[i] + mo) % mo;
}
b.resize(a0);
return b;
} const int N = 1e7 + 5; ll fac[N], nf[N];
V a, b, c; void build(int n) {
fac[0] = 1; fo(i, 1, n) fac[i] = fac[i - 1] * i % mo;
nf[n] = ksm(fac[n], mo - 2); fd(i, n, 1) nf[i - 1] = nf[i] * i % mo;
} int n, m, w[11]; void build2() {
a.resize(m + 1); b.resize(m + 1); c.resize(m + 1);
fo(i, 1, m) a[i] = fac[n * i] * ksm(nf[i], n) % mo;
fo(i, 0, m) {
int s = 0; b[i] = 1;
fo(j, 1, n) s += w[j] + i, b[i] = b[i] * nf[w[j] + i] % mo;
b[i] = b[i] * fac[s] % mo;
}
fo(i, 0, m) {
int s = 0; c[i] = 1;
fo(j, 1, n) {
if(-w[j] + i < 0) c[i] = 0; else
s += -w[j] + i, c[i] = c[i] * nf[-w[j] + i] % mo;
}
c[i] = c[i] * fac[s] % mo;
}
} ll f[N], g[N]; int main() {
freopen("queue.in", "r", stdin);
freopen("queue.out", "w", stdout);
ntt :: build();
scanf("%d", &n); m = 1e6;
fo(i, 1, n) scanf("%d", &w[i]), m = min(m, w[i]);
fo(i, 1, n) w[i] -= m;
{
int ye = 1;
fo(i, 1, n) if(w[i]) ye = 0;
if(ye) {
pp("0\n"); return 0;
}
}
build(1e7);
build2();
a[0] ++; a = a * a; a.resize(m + 1);
c = c * b; c.resize(m + 1);
ff(i, 0, a.si) a[i] = (a[i] - c[i] + mo) % mo;
a = qni(a); b = b * a;
pp("%lld\n", b[m]);
}

7.12模拟T2(套路容斥+多项式求逆)的更多相关文章

  1. LOJ2527 HAOI2018 染色 容斥、生成函数、多项式求逆

    传送门 调了1h竟然是因为1004535809写成了998244353 "恰好有\(K\)种颜色出现了\(S\)次"的限制似乎并不容易达到,考虑容斥计算. 令\(c_j\)表示强制 ...

  2. 2018.12.30 洛谷P4238 【模板】多项式求逆

    传送门 多项式求逆模板题. 简单讲讲? 多项式求逆 定义: 对于一个多项式A(x)A(x)A(x),如果存在一个多项式B(x)B(x)B(x),满足B(x)B(x)B(x)的次数小于等于A(x)A(x ...

  3. P6295-有标号 DAG 计数【多项式求逆,多项式ln】

    正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...

  4. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  5. Re.多项式求逆

    前言 emmm暂无 多项式求逆目的 顾名思义 就是求出一个多项式的摸xn时的逆 给定一个多项式F(x),请求出一个多项式G(x),满足F(x)∗G(x)≡1(modxn),系数对998244353取模 ...

  6. BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)

    题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...

  7. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

  8. 【bzoj3456】城市规划(多项式求逆+dp)

    Description 求\(~n~\)个点组成的有标号无向连通图的个数.\(~1 \leq n \leq 13 \times 10 ^ 4~\). Solution 这道题的弱化版是poj1737, ...

  9. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

随机推荐

  1. 视频专家之路【二】:ffmpeg工具的使用

    本文是听了雷宵骅大神的课之后的总结,部分内容借用了其PPT的内容,如有侵权请告知删除. 雷宵骅大神的博客为:https://blog.csdn.net/leixiaohua1020 要学习汽修,那么首 ...

  2. Android各种蓝牙设备的UUID(转)

    转自:http://www.14blog.com/archives/481 UUID是“Universally Unique Identifier”的简称,通用唯一识别码的意思.对于蓝牙设备,每个服务 ...

  3. 基于Docker构建Jenkins CI平台

    1.部署gitlab 1.1 部署gitlab docker run -d \ --name gitlab \ -p 8443:443 \ -p 9999:80 \ -p 9998:22 \ -v $ ...

  4. Python 调用自己编写的Class

    假设自己写的 class 文件myPets.py放在当前目录的子目录/myClasses下,在myPets.py中定义了一个 class 叫Pet.现在要调用Pet这个 class : from my ...

  5. 编码格式分类: 前后端传递数据的编码格式contentType

    urlencoded:form表单和ajax提交数据的默认编码格式 form-data:传文件 application/json:json格式数据 >>> 前后端分离 urlenco ...

  6. django 工具类配置

    好久没发新博客,凑个数... django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面 ...

  7. putty字体和颜色修改

    来源:https://www.igvita.com/2008/04/14/custom-putty-color-themes/ 网站上有putty的注册表,可以修改putty显示的配色方案. 非常棒!

  8. Mac上安装Android SDK

    今天开始学习IOS,所以先买了个设备先,但是开始使用了苹果本,还是需要继续开发Android,因为那是我现在吃饭的东西,所以就需要在Mac上配置Android SDK,原以为安装SDK很简单,和Win ...

  9. PC 端响应式布局

    前言:PC端 电脑显示器的尺寸种类还是很多的,台式电脑和笔记本电脑尺寸相差就更明显,所以响应式布局还是很重要的,甚至是必须要考虑的. 响应式的页面好不好,在后管平台上很明显.因为后管平台,一般是全屏显 ...

  10. Openfire调整成自己的IM部署到LInux系统上

    部署自己的IM到Linux系统下:需要生成相关jar包再部署 1.在myeclipse上把openfire源代码加在加载进来,做相应调整后,运行测试没问题 2.  编译admin-jsp.jar(所有 ...