「NOI十联测」黑暗
「NOI十联测」黑暗
\(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和。(n≤30000,m≤15)
令\(ans[n][m]\)为n个点,图的权值是连通块个数的 m 次方,最终的答案.
\(g[i]\)为\(i\)个点无向联通图数目.
一个图,若连通块数T增加1,那么贡献为\(\displaystyle (T+1)^m=\sum_{i=0}^m C_m^i T^i\).
这里选取\(i\)个点组成一个连通块(包含一个指定的点),联通块数目增加1.
\]
\]
令 \(\displaystyle T[i][j]=\sum_{k=0}^j {ans[i][k]\over k! (j-k)!}\)
\]
枚举m.
m=0的时候ans即为图的个数.
之后分治FFT...
复杂度\(O(nmlog(n^2)+nm^2)\).
代码里把\(i=n\)单独提出,其实可以不提出。
#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r) {
static char c;
r=0;
while(c=getchar(),!isdigit(c));
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
}
const int mn=30005;
const int mod=998244353;
int mul[mn],inv[mn];
int all[mn],un_able[mn],_able[mn];
int mlv(int x,int v){
int ans=1;
while(v){
if(v&1)ans=1LL*ans*x%mod;
x=1LL*x*x%mod,v>>=1;
}
return ans;
}
namespace NTT{
const int g=3;
const int gg=332748118;
int n,lim,to[66000];
void DFT(int* a,int iv){
rep(q,0,n-1)if(to[q]<q)swap(a[q],a[to[q]]);
for(int len=2;len<=n;len<<=1){
int mv=1,ml=mlv(iv?g:gg,(mod-1)/len),sp=len>>1;
for(int k=0;k<sp;++k){
for(int* p=a;p!=a+n;p+=len){
int mid=1LL*p[k+sp]*mv%mod;
p[k+sp]=(p[k]-mid)%mod;
p[k]=(p[k]+mid)%mod;
}
mv=1LL*mv*ml%mod;
}
}
}
void solve(int* a,int len1,int* b,int len2,int* c){
n=1,lim=0;
while(n<(len1+len2))n<<=1,++lim;
rep(q,len1,n-1)a[q]=0;
rep(q,len2,n-1)b[q]=0;
rep(q,0,n-1)to[q]=to[q>>1]>>1 | (q&1)<<(lim-1);
DFT(a,1),DFT(b,1);
rep(q,0,n-1)c[q]=1LL*a[q]*b[q]%mod;
DFT(c,0);
int inv_n=mlv(n,mod-2);
rep(q,0,n-1)c[q]=1LL*c[q]*inv_n%mod;
rep(q,0,n-1)c[q]=(c[q]+mod)%mod;
}
}
int dp[mn],dp1[mn],A[66000],B[66000],C[66000];
void solve(int l,int r){
if(l>r)return;
if(l==r){
un_able[l]=1LL*un_able[l]*mul[l-1]%mod;
_able[l]=((long long)all[l]-un_able[l]+mod)%mod;
return;
}
int mid=l+r>>1;
solve(l,mid);
rep(q,l,mid)A[q-l]=1LL*_able[q]*inv[q-1]%mod;
rep(q,1,r-l)B[q-1]=1LL*all[q]*inv[q]%mod;
NTT::solve(A,mid-l+1,B,r-l,C);
rep(q,mid+1,r)un_able[q]=(un_able[q]+C[q-l-1])%mod;
solve(mid+1,r);
}
int ans[16][30005],mid[16][30005],nw;
int *md,*md1;
void cdq(int l,int r){
if(l>r)return;
if(l==r){
md[l]=1LL*mul[nw]*mul[l-1]%mod*md[l]%mod;
md[l]=(md[l]+_able[l])%mod;
rep(q,0,nw)md1[l]=(md1[l]+1LL*ans[q][l]*inv[q]%mod*inv[nw-q])%mod;
return;
}
int mid=l+r>>1;
cdq(l,mid);
rep(q,l,mid)A[q-l]=1LL*md1[q]*inv[q]%mod;
rep(q,1,r-l)B[q-1]=1LL*_able[q]*inv[q-1]%mod;
NTT::solve(A,mid-l+1,B,r-l,C);
rep(q,mid+1,r)md[q]=(md[q]+C[q-l-1])%mod;
cdq(mid+1,r);
}
struct qr{
int a,b;
}st[1005];
int main(){
freopen("dark.in","r",stdin);
freopen("dark.out","w",stdout);
int T,m,n=15;
in(T);
rep(q,1,T)in(st[q].a),in(st[q].b),n=max(n,st[q].a);
mul[0]=1;
rep(q,1,n)mul[q]=1LL*mul[q-1]*q%mod;
inv[0]=inv[1]=1;
rep(q,2,n)inv[q]=1LL*(mod-mod/q)*inv[mod%q]%mod;
rep(q,1,n)inv[q]=1LL*inv[q]*inv[q-1]%mod;
all[0]=1;
rep(q,1,n)all[q]=mlv(2,q*(q-1)>>1);
solve(1,n);
md=ans[0],md1=mid[0];
rep(q,1,n)md[q]=md1[q]=mlv(2,q*(q-1)>>1);
rep(q,1,15){
md=ans[q],md1=mid[q],nw=q;
cdq(1,n);
}
rep(q,1,T)printf("%d\n",ans[st[q].b][st[q].a]);
return 0;
}
「NOI十联测」黑暗的更多相关文章
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- 「NOI十联测」奥义商店
「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...
- 「NOI十联测」反函数
30pts 令(为1,)为-1: 暴力枚举每个点为起始点的路径,一条路径是合法的当且仅当路径权值和为0且路径上没有出现过负数. 将所有答案算出. 100pts 使用点分治. 要求知道经过重心root的 ...
- HHHOJ #153. 「NOI模拟 #2」Kotomi
抽代的成分远远大于OI的成分 首先把一个点定为原点,然后我们发现如果我们不旋转此时答案就是所有位置的\(\gcd\) 如果要选择怎么办,我们考虑把我们选定的网格边连同方向和大小看做单位向量\(\vec ...
- HHHOJ #151. 「NOI模拟 #2」Nagisa
计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
- Solution -「NOI 模拟赛」彩色挂饰
\(\mathcal{Description}\) 给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...
- Solution -「NOI 模拟赛」出题人
\(\mathcal{Description}\) 给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...
- 「洛谷 P1801」黑匣子
好像很久没有更过博客了,因为博主这几周很忙.其实是在搞颓. 题意很难懂,所以就不重复了.其实是懒. 一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不 ...
随机推荐
- .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记
目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...
- CAS学习笔记二:CAS单点登录流程
背景 由于公司项目甲方众多,各甲方为了统一登录用户体系实现单点登录(SSO)开始要求各乙方项目对接其搭建的CAS单点登录服务,有段时间对CAS的流程很迷,各厂商还有基于CAS进行二次开发的情况,所以对 ...
- Java 设置系统参数和运行参数
系统参数 系统级全局变量,该参数在程序中任何位置都可以访问到.优先级最高,覆盖程序中同名配置. 系统参数的标准格式为:-Dargname=argvalue,多个参数之间用空格隔开,如果参数值中间有空格 ...
- CSS基础 阴影相关属性设置
一.字体阴影属性名:text-shadow:水平偏移量 垂直偏移量 模糊度 阴影颜色: html代码: <div>农夫山泉有点甜</div>css代码: div{ font-s ...
- 初识python: 局部变量、全局变量
定义: 全局变量:在函数一开始定义的变量(全局范围内都可以使用) 局部变量:在函数中定义的变量(只能在函数中使用) 局部变量,例: #局部变量 def chang_name(name): print( ...
- github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得
1.前言 使用 git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...
- spring boot -- 配置文件application.properties 换成 application.yml
1.前言 其实两种配置文件在spring boot 的作用一样,只是写法不同 ,yml 可以写的内容更少 ,以树结构 书写内容,看起来很清晰, 但是 如果 项目配置文件设置为 既有properties ...
- 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
问题描述 如何在一个AppService下同时部署运行多个Java 应用程序呢? 问题解答 因为App Service的默认根目录为 wwwroot.如果需要运行多个Java 应用程序,需要在 www ...
- Python常用功能函数总结系列
Python常用功能函数系列总结(一) 常用函数一:获取指定文件夹内所有文件 常用函数二:文件合并 常用函数三:将文件按时间划分 常用函数四:数据去重 Python常用功能函数系列总结(二) 常用函数 ...
- 灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor)
灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor) 近日,国内领先的云原生全栈私有云提供商灵雀云宣布,推出企业版云原生制品仓库Ala ...