题目描述

题解:

岛屿之间的边砍/不砍情况有$2^n$种,

但是需要剪掉所有的岛上都首尾相连的情况。

$dp$一下对于完全图没有限制($f$)/有限制($g$)的情况数。

方程:$$f[i]=\sum(C(i-1,j-1)*j^{(j-2)}*f[i-j])$$

$$g[i]=\sum(C(i-2,j-2)*j^{(j-2)}*f[i-j])$$

其中$j^(j-2)$是$j$个点的完全图的生成树个数。

打开组合数之后$CDQ$即可。

统计答案时$ans=2^n*\prod(f)-\prod(g)$。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MOD = ;
const int N = ;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch = getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f * c;
}
ll fastpow(ll x,int y)
{
ll ret = ;
while(y)
{
if(y&)ret= ret*x%MOD;
x= x*x % MOD;
y>>=;
}
return ret;
}
int to[*N],lim=,L;
ll W[*N],inv;
void ntt(ll *a,int len,int k)
{
for(int i=;i<len;i++)
if(i<to[i])swap(a[i],a[to[i]]);
for(int i=;i<len;i<<=)
{
ll w0 = W[i];
for(int j=;j<len;j+=(i<<))
{
ll w = ;
for(int o=;o<i;o++,w=w*w0%MOD)
{
ll w1 = a[j+o],w2 = a[j+o+i]*w%MOD;
a[j+o] = (w1+w2)%MOD;
a[j+o+i] = (w1-w2+MOD)%MOD;
}
}
}
if(k==-)
{
for(int i=;i<(len>>);i++)swap(a[i],a[len-i]);
for(int i=;i<len;i++)a[i]=a[i]*inv%MOD;
}
}
ll a[*N],b[*N],c[*N],d[*N],e[*N];
ll f[N],g[N],fj[N],gj[N],jc[N],jn[N];
void clear()
{
for(int i=;i<lim;i++)a[i]=b[i]=;
}
void work()
{
ntt(a,lim,),ntt(b,lim,),ntt(c,lim,);
for(int i=;i<lim;i++)d[i]=a[i]*b[i]%MOD,e[i]=a[i]*c[i]%MOD;
ntt(d,lim,-),ntt(e,lim,-);
}
void cdq(int l,int r)
{
if(l==r)
{
if(l==)f[l] = ;
else f[l] = f[l]*jc[l-]%MOD;
if(l<=)g[l] = ;
else g[l] = g[l]*jc[l-]%MOD;
return ;
}
int mid = (l+r)>>;
cdq(l,mid);
lim = ,L = ;
while(lim<=(r-l+))lim<<=,L++;
for(int i=;i<lim;i++)to[i]=((to[i>>]>>)|((i&)<<(L-)));
inv = fastpow(lim,MOD-);
for(int i=;i<lim;i<<=)W[i]=fastpow(,(MOD-)/(i<<));
clear();
for(int i=;i<=mid-l;i++)a[i]=f[i+l]*jn[i+l]%MOD;
for(int i=;i<=r-l;i++)b[i]=fj[i],c[i]=gj[i];
work();
for(int i=mid-l+;i<=r-l;i++)f[i+l]=(f[i+l]+d[i])%MOD;
for(int i=mid-l+;i<=r-l;i++)g[i+l]=(g[i+l]+e[i])%MOD;
cdq(mid+,r);
}
int T,n,x;
int main()
{
jc[]=jn[]=;
fj[]=jc[]=jn[]=;
for(int i=;i<=;i++)
{
jc[i] = jc[i-] * i % MOD;
jn[i] = fastpow(jc[i],MOD-);
ll tmp = fastpow(i,i-);
fj[i] = tmp*jn[i-]%MOD;
gj[i] = tmp*jn[i-]%MOD;
}
cdq(,);
read(T);
while(T--)
{
read(n);
ll s1=,s2=;
for(int i=;i<=n;i++)
{
read(x);
s1 = s1 * f[x]%MOD;
s2 = s2 * g[x]%MOD;
}
s1 = s1*fastpow(,n)%MOD;
printf("%lld\n",(s1-s2+MOD)%MOD);
}
return ;
}

hdu5279 YJC plays Minecraft的更多相关文章

  1. hdu5279 YJC plays Minecraft 【分治NTT】

    题目链接 hdu5279 题解 给出若干个完全图,然后完全图之间首尾相连并成环,要求删边使得两点之间路径数不超过\(1\),求方案数 容易想到各个完全图是独立的,每个完全图要删成一个森林,其实就是询问 ...

  2. HDU 5279 YJC plays Minecraft(NTT+分治)

    题意 有 \(n\) 个岛屿,第 \(i\) 个岛屿上有一张 \(a_i\) 的完全图.其中第 \(i\) 张完全图的 \(a_i\) 号节点和 \(i+1\) 号岛屿的 \(1\) 号节点有边相连( ...

  3. HDU 5279 YJC plays Minecraft (分治NTT优化DP)

    题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地 ...

  4. hdu 5279 YJC plays Minecraft——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...

  5. 题解 HDU 5279 YJC plays Minecraft

    题目传送门 题目大意 给出\(n\)以及\(a_{1,2,...,n}\),表示有\(n\)个完全图,第\(i\)个完全图大小为\(a_i\),这些完全图之间第\(i\)个完全图的点\(a_i\)与\ ...

  6. CDQ题目套路总结 [未完成]

    CDQ学习资料 day1cdq分治相关 CDQ的IOI论文 1.优化斜率dp 左边对右边影响维护一个凸包解决 需要知识:①凸包②斜率dp 题目:√ HDU3842 Machine Works   HY ...

  7. MineCraft note

    客户端:http://pan.baidu.com/s/1hqgS8sshttp://pan.baidu.com/s/1mgmkduC 材质包:R3D小地图MODCraftGuide mod 内置合成表 ...

  8. Ubuntu上安装Minecraft服务器

    Minecraft由于其独特的魅力吸引了很多玩家.不过游戏的乐趣只有在和朋友一起玩的时候才最有意思,所以很早以前我就想建设自己的服务器.但由于专业知识欠缺,没有实现. 最近接触了Linux服务器,所以 ...

  9. 纵观minecraft 游戏作者的世界观

    minecraft 这款游戏 独特的游戏背景 与 模式 深受我爱 ,游戏的音乐制作方面也是独具一格 但是 整个游戏的风气 充满孤独的色彩 抑郁惆怅的音乐 每当在日出时 响起 ,当你进入生存模式之后 开 ...

随机推荐

  1. 一个坑爹的Swift报错原因分析与解决方案

    有时候在实际开发中,完全没有任何问题.但是一到实机测试,就会直接卡机   let count = scoreStorage.count return scoreStorage[Int(arc4rand ...

  2. ObjectARX学习笔记

    http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...

  3. BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)

    哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...

  4. loj#2540. 「PKUWC2018」随机算法

    传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...

  5. smtplib报警模块

    #!/usr/bin/env python # coding:utf-8 import time import subprocess import smtplib from email.mime.te ...

  6. Elipse 无法启动问题(转)

    来源: <http://www.cnblogs.com/coding-way/archive/2012/10/17/2727481.html> 当选择完workspace之后,eclips ...

  7. 145 Binary Tree Postorder Traversal 二叉树的后序遍历

    给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3],   1    \     2    /   3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...

  8. 142 Linked List Cycle II 环形链表 II

    给一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.说明:不应修改给定的链表.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/proble ...

  9. Centos 6.5安装MySQL-python

    报错信息: Using cached MySQL-python-1.2.5.zip     Complete output from command python setup.py egg_info: ...

  10. storm的3节点集群详细启动步骤(非HA和HA)(图文详解)

    前期博客 apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA) 启动storm集群(HA) 本博文情况是 master(主) nimbus slave1( ...