题目描述

题解:

岛屿之间的边砍/不砍情况有$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. H5+JS实现手机摇一摇功能

    在做微信活动页面的时候,经常会需要实现手机摇一摇功能,比如“摇一摇,拿好礼”. 为了实现它,就需要用到HTML5的DeviceOrientation特性.它提供的DeviceMotion事件封装了设备 ...

  2. bzoj 1176 [Balkan2007]Mokia 【CDQ分治】

    W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...

  3. 11.6NOIP模拟赛

    [数据规模和限制] 对于全部测试数据,满足 N,M,K≤,W≤ 各个测试点的数据规模及特殊性质如下表. 测试点 N M K ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ ≤ 师 更多咨询:北京信息学窦老师 QQ ...

  4. 园艺研究生中途自学Java,赶上校招终进美团,分享面试经验

    前言 最近,圈子里的很多小伙伴都在面试,有些小伙伴儿拿到不错的offer,今天给大家推荐的这位小伙伴拿到美团点评的校招offer,他将自己这次面试的经历写下来供大家参考,看看你能回答多少? 背景 上海 ...

  5. LuoguP2055 [ZJOI2009]假期的宿舍【二分图最大匹配】By cellur925

    题目传送门 这道题开始感觉不出是二分图最大匹配的qwq.但是今天学了匈牙利算法,想来做几个题qwq.做这个题的时候想了很久它哪里是二分图,脑子里是“两列,每列有很多点的那种图 qwq.” 然后看了题解 ...

  6. mysql用户和授权

    CREATE USER 'monitor'@'10.224.32.%' IDENTIFIED BY '123@abAB'; mysql> GRANT select,insert,update O ...

  7. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  8. HTML入门与基础 —— 标签《一》

    一.标签概述 1.HTML(英文Hyper Text Markup Language的缩写)中文译为“超文本标签语言”,主要是通过HTML标签对网页中的文本.图片.声音等内容进行描述. 2.标签分为嵌 ...

  9. hibernate Day1 案例代码

    1.创建Person类 package com.icss.pojo; public class Person { private int uid; private String uname; priv ...

  10. Eclipse 运行内存不足情况

    在debug或者run 时 在VM arguments 处添加  -Xms512m -Xmx512m