【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

题意:有好坏两种点共 nnn 个,每个好点有权值,把这 nnn 个点连成一棵树,一个好点为有用的当且仅当它至少与一个好点相邻,求所有有用的点的权值和不超过 limlimlim 的方案数。

n≤40n\leq 40n40

这题网上的容斥方法基本都是假的……

发现至少与一个好点相邻不好处理,但只能与坏点相邻比较方便,所以大概是个容斥。

设有 mmm 个好点, f(k)f(k)f(k) 表示钦定 kkk 个点,有用的点只能在这 kkk 个当中选,相当于钦定其他 m−km-kmk 个是没用的。(以下简称“可以有用”。)g(k)g(k)g(k) 表示恰好有 kkk 个有用的点。

那么有

f(k)=∑i=0k(ki)g(i)f(k)=\sum_{i=0}^k\binom{k}{i}g(i)f(k)=i=0k(ik)g(i)

钦定 kkk 个可以有用的点后,把所有好点和坏点连边,有用的点和坏点内部连边,就可以算出 fff

然后你会发现你假了。

第一,你算矩阵树只能钦定固定的 kkk 个可以有用,而 fff 的定义是任意钦定,钦定这个动作本身的方案是算在其中的。

第二,因为这 kkk 个是不固定的,你算出了 ggg 也没法算答案……

所以必须要改下定义。

定义 f(k)f(k)f(k)已经确定了 kkk 个点可以有用的连边方案。也就是具体是哪 kkk 个点已经帮你钦定好了,你只需要管连边的方案。

g(k)g(k)g(k)已经确定恰好有 kkk 个点有用的连边方案,具体含义同上。

先不管权值的事情,对于一个钦定可以有用的方案,建出图后考虑它的一棵生成树,把钦定的 kkk 个点中全部连的坏点的拿出来,假设有 iii 个,就对应了一种 g(i)g(i)g(i) 的方案。

所以式子是一样的

f(k)=∑i=0k(ki)g(i)f(k)=\sum_{i=0}^k\binom{k}{i}g(i)f(k)=i=0k(ik)g(i)

二项式反演

g(k)=∑i=0k(−1)k−i(ki)f(i)g(k)=\sum_{i=0}^k(-1)^{k-i}\binom{k}{i}f(i)g(k)=i=0k(1)ki(ik)f(i)

fff 因为是矩阵树算的,已经钦定好了。对于所有 g(k)g(k)g(k),乘上钦定本身的方案的和就是答案。钦定本身可以折半搜索+two pointer算出。

复杂度 O(2n/2+n4)O(2^{n/2}+n^4)O(2n/2+n4)

顺带一提,如果是钦定没用的点,式子是长这样的

f(k)=∑i=km(m−ki−k)g(i)f(k)=\sum_{i=k}^m\binom{m-k}{i-k}g(i)f(k)=i=km(ikmk)g(i)

而不是

f(k)=∑i=km(ik)g(i)f(k)=\sum_{i=k}^m\binom{i}{k}g(i)f(k)=i=km(ki)g(i)

原因同上

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans;
}
int C[45][45],n,lim,a[45],cnt[45],f[45];
vector<int> L[45],R[45];
void dfs(vector<int>* v,int cur,int pos,int k,int sum)
{if (sum>lim) return;if (cur>pos) return v[k].push_back(sum);dfs(v,cur+1,pos,k,sum);dfs(v,cur+1,pos,k+1,sum+a[cur]);
}
inline int calc(const vector<int>& a,const vector<int>& b)
{int pos=b.size(),ans=0;for (int i=0;i<(int)a.size();i++){while (pos&&a[i]+b[pos-1]>lim) --pos;ans=(ans+pos)%MOD;}return ans;
}
int g[45][45];
inline int det(int n)
{int ans=1;for (int i=1;i<n;i++) for (int j=1;j<n;j++) (g[i][j]<0)&&(g[i][j]+=MOD);for (int i=1;i<n;i++){int pos=i;for (;!g[pos][i]&&pos<n;++pos);if (pos==n) return 0;if (pos>i) swap(g[i],g[pos]),ans=MOD-ans;ans=(ll)ans*g[i][i]%MOD;for (int j=i+1;j<n;j++){int t=(ll)g[j][i]*qpow(g[i][i],MOD-2)%MOD;for (int k=i;k<n;k++) g[j][k]=(g[j][k]-(ll)t*g[i][k]%MOD+MOD)%MOD;}}return ans;
}
int main()
{scanf("%d%d",&n,&lim);C[0][0]=1;for (int i=1;i<=n;i++){C[i][0]=1;for (int j=1;j<=i;j++) C[i][j]=add(C[i-1][j-1],C[i-1][j]);}for (int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1);int bad=0;for (;a[bad+1]==-1;++bad);int mid=(bad+1+n)>>1;dfs(L,bad+1,mid,0,0),dfs(R,mid+1,n,0,0);int m=n-bad;for (int i=0;i<=m;i++) sort(L[i].begin(),L[i].end()),sort(R[i].begin(),R[i].end());for (int k=0;k<=m;k++){for (int i=0;i<=k;i++) cnt[k]=add(cnt[k],calc(L[i],R[k-i]));memset(g,0,sizeof(g));for (int i=1;i<=bad;i++)for (int j=1;j<i;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i];}for (int i=bad+1;i<=bad+k;i++)for (int j=1;j<i;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i];} for (int i=bad+k+1;i<=n;i++)for (int j=1;j<=bad;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i];	}f[k]=det(n);}int sum=0;for (int k=0;k<=m;k++){int ans=0;for (int i=0;i<=k;i++) ans=(ans+(((i-k)&1)? -1ll:1ll)*C[k][i]*f[i])%MOD;
//		cerr<<ans<<'\n';sum=(sum+(ll)cnt[k]*ans)%MOD;}printf("%d\n",(sum+MOD)%MOD);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2375 [NOI2014] 动物园 kmp fail指针/倍增

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 由kmpkmpkmp中失配数组nenene的含义我们知道&#xff0c;ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...都是iii的相等的前后缀&#xff0c;但是可能有重叠的部分&#xff0c…

DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?

话题缘起01今天在DevOps案例深度研究讨论群里&#xff0c;群友们围绕一种开发模式展开了讨论&#xff1a;DDD&#xff08;Deadline Driven Development&#xff09;&#xff0c;期限驱动开发&#xff0c;大家似乎更愿意将其翻译成“上吊绳驱动开发”。这种开发模式是说在接到新…

【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

题意&#xff1a;给定 nnn 个数 aia_iai​ &#xff0c;求选出&#xff08;可以重复&#xff0c;考虑顺序&#xff09;MMM 个数和为 SSS 的方案数模 222。 n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq 10^5,M,S\leq 10^{18}n≤200,ai​≤105,M,S≤1018 首先给每个数分配一个出…

「Sqlserver」数据分析师有理由爱Sqlserver-好用的插件工具推荐

在此系列中&#xff0c;笔者为大家带来一些以数据分析师视角去使用Sqlserver的系列文章&#xff0c;希望笔者走过的路能够给后来者带来一些便利。背景介绍在数据分析师的角色下&#xff0c;使用数据库更多的是为了从数据库中获取数据&#xff0c;和数据库交互的语言是SQL&#…

P4824 [USACO15FEB]Censoring S kmp + 栈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 如果删除之后两个串不拼起来就是个裸kmpkmpkmp了&#xff0c;但是这个题能拼起来&#xff0c;拼起来之后还有可能生成一个新的串&#xff0c;而且起点在当前位置之前。 考虑是否能找到删掉…

使用kubectl管理k8s集群(三十)

前言Foreword在搭建k8s集群之前&#xff0c;我们需要先了解下kubectl的使用&#xff0c;以便在集群部署出现问题时进行检查和处理。命令和语法记不住没有关系&#xff0c;但是请记住主要的语法和命令以及帮助命令的使用。在下一篇&#xff0c;我们将讲述使用Kubeadm来创建k8s集…

【启智树NOIP模拟】生存【父子分治】

题意&#xff1a;有 nnn 个城市连成一棵树&#xff0c;每个城市有 aia_iai​ 个人。接下来 mmm 天每天会发生 kik_iki​ 次灾难&#xff0c;每个灾难会让一个给定城市的人全部死掉。每个人一天可以走一条边&#xff0c;也可以不动。求最多多少人能活过这 mmm 天。 n≤106,∑ki≤…

P3435 [POI2006]OKR-Periods of Words kmp + fail指针

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 转换一下题意&#xff0c;就是求一个最小公共前后缀&#xff0c;显然可以暴跳nenene数组&#xff0c;复杂度O(n2)O(n^2)O(n2)&#xff0c;注意到我们每次都跳的话会跳到很多重复的位置&…

架构杂谈《四》

分布式一致性协议一、引言在分布式系统中&#xff0c;为了保证数据的高可用&#xff0c;通常会将数据保留多个副本(replica)&#xff0c;这些个副本会放在不同的物理机上&#xff0c;为了对用户提供正确的数据&#xff0c;我们需要保证这些放在不同物理机上的副本是一致的。为了…

【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

题意&#xff1a;给一棵树&#xff0c;两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块&#xff0c;使得这 kkk 个连通块存在一个公共点&#xff0c;且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL&#xff0c;求方案数 模 998244353998244353998244353。两种方案不同当且仅…

Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 通过完美子串的定义&#xff0c;我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串&#xff0c;现在问题就是如何求这些前缀串在串中出现的次数了。 考虑一个前…

译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)

原文&#xff1a;Cesar De la Torre翻译&#xff1a;Edi Wang我们很高兴地宣布ML.NET 1.2 和模型生成器和 CLI 的更新。ML.NET是 .NET 开发人员的开源和跨平台机器学习框架。ML.NET还包括模型生成器(Visual Studio 的简单 UI 工具)和ML.NET CLI(命令行界面),以便使用自动机器学…

【十二省联考2019】皮配【分部dp】

题意&#xff1a;有 nnn 个学校隶属于 ccc 个城市&#xff0c;每个学校有 sis_isi​ 个人。把它们放入一个 222\times 222 的格子中&#xff0c;要求同一学校的必须放在同一个格子&#xff0c;同一城市的必须放在同一行&#xff0c;并给出两行两列分别最多能放的人数C0,C1,D0,D…

Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 之前做过类似的题&#xff0c;翻转一个字串相当于将任意两个不相交的串连在一起。再一看字符集≤20\le20≤20&#xff0c;那就是铁子集dpdpdp了。 定义f[i]f[i]f[i]表示状态为iii的串的长度…

一个超轻量级工作流引擎:Workflow-Core

近期工作上有一个工作流的开发需求&#xff0c;自己基于面向对象和职责链模式捣鼓了一套小框架&#xff0c;后来在github上发现一个轻量级的工作流引擎轮子&#xff1a;Workflow-Core&#xff0c;看完其wiki之后决定放弃之前自己造的轮子&#xff0c;使用这个开源项目来改造&am…

Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接考虑比较难想&#xff0c;这种公式题基本都是将部分答案看成一个整体&#xff0c;考虑xi,xi1x_i,x_{i1}xi​,xi1​的贡献的。 假设当前的xix,xi1y,x<yx_ix,x_{i1}y,x<yxi​x,xi1…

【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

题意&#xff1a;长度为 nnn 的环染 mmm 种颜色&#xff0c;要求任意相邻 mmm 个元素不能包含全部的颜色。求方案数 模 109710^971097&#xff0c;循环同构。 n≤109,m≤7n\leq 10^9,m\leq7n≤109,m≤7 为啥我现在天天都在打表啊 先上 polya&#xff0c;对于移动 iii 位的置换…

ASP.NET Core 3.0中支持AI的生物识别安全

本文共两个部分&#xff0c;这是第一部分&#xff0c;其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型。此部分提供了此授权进程的基于生物识别信息&#xff08;如人脸识别或语音识别&#xff09;的具体示例。在此示例中&#xff0c;检…

Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn个人&#xff0c;每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​&#xff0c;当他会第xxx个技能的时候&#xff0c;aia_iai​的第xxx位是111。定义当xxx不会某个技能但是yyy会的时候&#xff0…

架构杂谈《五》

保证最终一致性的模式在大规模、高并发服务化系统中&#xff0c;一个功能被拆分成多个具有功能单一的子功能&#xff0c;一个流程会有多个系统的多个单一功能的服务组合实现&#xff0c;如果使用两阶段提交协议和三阶段提交协议&#xff0c;确实能解决系统间的一致性问题。其实…