题目描述

题解:

岛屿之间的边砍/不砍情况有$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. python 子类调用父类成员的方法

    1.直接写类名调用: parent_class.parent_attribute(self) class Animal(): def __init__(self, name): self.name = ...

  2. 优化 SQL 查询:如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  3. vim normal 模式下L键

    vim normal 模式下L键总是到一行的最后一个字符,而不是最后一个字符的下一个字符,这样进入插入模式,就还得往右移动一下,就很费劲? 怎么解决 更新: a键进入插入即可

  4. hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装   .HBase的伪分布模式(1节点)的启动    .HBas ...

  5. 莫比乌斯函数 && HDU-1695

    莫比乌斯函数定义: $$\mu(d)=\begin{cases}1 &\text{d = 1}\\(-1)^r &\text{$d=p_1p_2...p_r,其中p_i为不同的素数$} ...

  6. 贪心 HDOJ 5090 Game with Pearls

    题目传送门 /* 题意:给n, k,然后允许给某一个数加上k的正整数倍,当然可以不加, 问你是否可以把这n个数变成1,2,3,...,n, 可以就输出Jerry, 否则输出Tom. 贪心:保存可能变成 ...

  7. Magento 缓存机制简析

    在知道缓存机制前,首先需要知道,Magento的路由机制,这边就不做赘述了,百度一大堆. 下面一个简单的缓存生效流程: A:首先在页面开始时,Magento在app\code\core\Mage\Co ...

  8. 1049 - One Way Roads 观察 dfs

    http://lightoj.com/volume_showproblem.php?problem=1049 题意是,在一副有向图中,要使得它变成一个首尾相连的图,需要的最小代价. 就是本来是1--& ...

  9. Coursera:一流大学免费在线课程平台

    https://www.coursera.org/ 微软联合创始人 Bill Gates 从公司退隐后,一直和妻子 Melinda 忙于公益事业.但离开 IT 圈并未改变他穿廉价衬衫和保持学习的习惯— ...

  10. P3817 小A的糖果

    题目描述 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. 输入输出格式 输入格 ...