题目链接

hdu5279

题解

给出若干个完全图,然后完全图之间首尾相连并成环,要求删边使得两点之间路径数不超过\(1\),求方案数

容易想到各个完全图是独立的,每个完全图要删成一个森林,其实就是询问\(n\)个点有标号森林的个数
设\(f[i]\)表示\(i\)个点有标号森林的个数
枚举第一个点所在树大小,我们只需求出\(n\)个点有多少种树,由\(purfer\)序容易知道是\(n^{n - 2}\)
那么有
\[f[n] = \sum\limits_{i = 1}^{n} {n - 1 \choose i - 1}i^{i - 2}f[n - i]\]
化简一下:
\[f[n] = (n - 1)!\sum\limits_{i = 1}^{n}\frac{i^{i - 2}}{(i - 1)!} \times \frac{f[n - i]}{(n - i)!}\]
分治\(NTT\)即可

每个完全图的方案是\(f[a[i]]\),中间相连的\(n\)条边有\(2^n\)种方案,由乘法原理乘起来即可

但是这样求出来的不是答案,会多算一类情况:
每个完全图的\(1\)和\(a_i\)相通且所有中介边存在
所以我们还需要计算\(g[i]\)表示\(i\)个点的森林,\(1\)和\(i\)点在同一棵树内的方案数
显然
\[g[n] = \sum\limits_{i = 2}^{n} {n - 2 \choose i - 2}i^{i - 2}f[n - i]\]
化简得
\[g[n] = (n - 2)!\sum\limits_{i = 2}^{n} \frac{i^{i - 2}}{(i - 2)!} \times \frac{f[n - i]}{(n - i)!}\]
\(NTT\)即可

最后答案减去\(g[a[i]]\)的乘积即可
复杂度\(O(nlog^2n)\)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 400005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
const int G = 3,P = 998244353;
int R[maxn];
inline int qpow(int a,int b){int re = 1;for (; b; b >>= 1,a = 1ll * a * a % P)if (b & 1) re = 1ll * re * a % P;return re;
}
void NTT(int* a,int n,int f){for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);for (int i = 1; i < n; i <<= 1){int gn = qpow(G,(P - 1) / (i << 1));for (int j = 0; j < n; j += (i << 1)){int g = 1,x,y;for (int k = 0; k < i; k++,g = 1ll * g * gn % P){x = a[j + k],y = 1ll * g * a[j + k + i] % P;a[j + k] = (x + y) % P,a[j + k + i] = ((x - y) % P + P) % P;}}}if (f == 1) return;int nv = qpow(n,P - 2); reverse(a + 1,a + n);for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * nv % P;
}int f[maxn],g[maxn],fac[maxn],fv[maxn],p[maxn],N = 100005;
int A[maxn],B[maxn];
void solve(int l,int r){if (l == r){if (l > 0) f[l] = 1ll * f[l] * fac[l - 1] % P;return;}int mid = l + r >> 1;solve(l,mid);int n,m,L;m = mid - l + 1;for (int i = 0; i < m; i++) A[i] = 1ll * f[l + i] * fv[l + i] % P;m = r - l;for (int i = 0; i < m; i++) B[i] = 1ll * p[i + 1] * fv[i] % P;n = 1; L = 0; m = mid + r - (l << 1) - 1;while (n <= m) n <<= 1,L++;for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));for (int i = mid - l + 1; i < n; i++) A[i] = 0;for (int i = r - l; i < n; i++) B[i] = 0;NTT(A,n,1); NTT(B,n,1);for (int i = 0; i < n; i++) A[i] = 1ll * A[i] * B[i] % P;NTT(A,n,-1);for (int i = mid - l,j = mid + 1; j <= r; i++,j++){f[j] = (f[j] + A[i]) % P;}solve(mid + 1,r);
}
int b[maxn];
inline int C(int n,int m){if (m > n) return 0;return 1ll * fac[n] * fv[m] % P * fv[n - m] % P;
}
void work(){fac[0] = p[0] = p[1] = 1;for (int i = 1; i <= N + 2; i++)fac[i] = 1ll * fac[i - 1] * i % P;for (int i = 2; i <= N + 2; i++)p[i] = qpow(i,i - 2);fv[N + 2] = qpow(fac[N + 2],P - 2); fv[0] = 1;for (int i = N + 1; i; i--)fv[i] = 1ll * fv[i + 1] * (i + 1) % P;f[0] = 1;solve(0,N);A[0] = A[1] = 0;for (int i = 2; i <= N; i++) A[i] = 1ll * p[i] * fv[i - 2] % P;for (int i = 0; i <= N; i++) B[i] = 1ll * f[i] * fv[i] % P;int n = 1,L = 0;while (n <= (N << 1)) n <<= 1,L++;for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));for (int i = N + 1; i < n; i++) A[i] = 0;for (int i = N + 1; i < n; i++) B[i] = 0;NTT(A,n,1); NTT(B,n,1);for (int i = 0; i < n; i++) A[i] = 1ll * A[i] * B[i] % P;NTT(A,n,-1);for (int i = 2; i <= N; i++) g[i] = 1ll * A[i] * fac[i - 2] % P;g[1] = 1;
}
int n,a[maxn],ans,ans2;
int main(){work();//REP(i,100) printf("%d ",f[i]); puts("");//REP(i,100) printf("%d ",g[i]); puts("");int T = read();while (T--){n = read();REP(i,n) a[i] = read();ans = qpow(2,n);REP(i,n) ans = 1ll * ans * f[a[i]] % P;ans2 = 1;REP(i,n) ans2 = 1ll * ans2 * g[a[i]] % P;ans = ((ans - ans2) % P + P) % P;printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9172482.html

hdu5279 YJC plays Minecraft 【分治NTT】相关推荐

  1. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  2. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

  3. 【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】

    不知道这题能不能发出来,如果不能请联系我,我什么都会做的 题意:给一棵 nnn 个结点的树,每个结点有个 ax+bax+bax+b,求所有根到叶子的乘积之和.系数模 99824435399824435 ...

  4. 【洛谷P4705】玩游戏【二项式定理】【NTT卷积】【生成函数】【分治NTT】【函数求导】【多项式对数】

    传送门 题意:给定长度为N,MN,MN,M的序列a,ba,ba,b和ttt,随机选取x∈[1,N],y∈[1,M]x \in[1,N],y\in[1,M]x∈[1,N],y∈[1,M],对于i=1,2 ...

  5. [XSY] 树与图(树形DP、生成函数、分治NTT、重链剖分)

    树与图 如果真的在图上跑算法,那么光建图复杂度就O(n2logn)O(n^2logn)O(n2logn)了,这显然不可行.所以一定要把 在图上的操作 转换成 在树上的操作 在图上删去点u,相当于在树上 ...

  6. 牛客练习赛50 F.tokitsukaze and Another Protoss and Zerg(分治+NTT)(模板题)

    题目 在n场1v1中,假设第i场,有ai个星灵单位,和bi个虫族单位. tokitsukaze可以在一场1v1中,任选一种种族进行游戏. 如果选择了星灵,那么在这场游戏中,可以选择出兵1到ai个单位. ...

  7. 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg(分治NTT)

    一些废话: 写完上一题(分治FFT)之后记起之前牛客写的这道题,题解是用启发式NTT,每次选两个项数最小的合并,当时没有整理NTT的模板所以就先mark了,今天受到分治FFT的启发,想用分治NTT来解 ...

  8. [JZOJ5666]【GDOI2018Day2模拟4.18】法力风暴(分治NTT 模板)

    Description 有 2≤n≤105,0≤Ai,k≤109 2 ≤ n ≤ 10 5 , 0 ≤ A i , k ≤ 10 9 2 ≤ n ≤ 10^5 ,0 ≤ A_i ,k ≤ 10^9 S ...

  9. 洛谷P4233 射命丸文的笔记 分治NTT+竞赛图

    Description 给定n 对于i从1~n,输出i个点组成竞赛图中,哈密顿回路的平均数量 Solution 竞赛图存在哈密顿回路的充要条件就是强连通 设f(n)f(n)f(n)表示n个点形成强连通 ...

最新文章

  1. 连接远程ms sql server 2000企业版时出现错误:10061的解决方法
  2. 初等数论--同余方程--二元一次不定方程的通解形式
  3. 【转】程序debug正常release错误
  4. Bootstrap学习笔记01【快速入门、栅格布局】
  5. 搜索推荐中的召回匹配模型综述(一):传统方法
  6. 【机器学习实战】——常见函数积累
  7. c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法
  8. 服装色差的识别成因与预防
  9. java动态运行代码并动态执行
  10. 【拜小白opencv】15-利用ROI将一幅图像叠加到另一幅图像的指定位置
  11. 华为路由器基本使用命令
  12. python任务栏显示网速_win10状态栏显示网速小工具_超好用
  13. MacBook苹果电脑翻盖自动开机及音效设置
  14. 【RK2206】4. MQTT示例
  15. CorelDRAW快速制作绚丽的彩色透明心形
  16. 深度学习热点|超直观无公式图解Contrastive Predictive Coding从脸盲说起
  17. offiice2013全套软件,加破击工具,教程,真是验证过链接:https://pan.baidu.com/s/1Csv4ZXDQyK_cKfpIXwwn6Q 提取码:h7dp 复制这段内容后打
  18. catia螺纹孔在二维图上不显示_请问Solidworks2018的螺纹孔我选中了装饰螺纹线,立体图里怎么没有显示螺纹线呢谢谢...
  19. 重磅!新职业技能证书来了,让你高薪就业
  20. 华为大数据云issues

热门文章

  1. 好程序员Java分享Java案例_英汉字典
  2. 索引原理及几种索引类型区别
  3. asp.net mvc 自定义全局过滤器 验证用户是否登录
  4. 查看SELinux状态
  5. pgd 游戏教程 基地
  6. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案
  7. c++成员变量与构造函数
  8. oracle数据库视图有红叉,oracle触发器 前面的红叉是什么意思
  9. 微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」
  10. Eclipse中将java类打成jar包形式运行