首页 > 其他分享 >LOJ #6160. 「美团 CodeM 初赛 Round A」二分图染色 思考--zhengjun

LOJ #6160. 「美团 CodeM 初赛 Round A」二分图染色 思考--zhengjun

时间:2023-07-16 19:12:01浏览次数:45  
标签:ifac LOJ ll 初赛 times zhengjun int ans mod

link

思维+容斥计数。

首先的转化比较妙,二分图转化为 \(n\times n\) 的网格图染色。

与网络流的转化方向相反,值得注意。

然后发现两种颜色(红、蓝)如果独立染色,同一个格子可能会重复染色。

考虑容斥,式子很好列,直接容斥即可。

\[ans=\sum\limits_{i=0}^n (-1)^n \times \binom{n}{i}^2\times i!\times g_{n-i}^2\\ g_n=\sum\limits_{i=0}^n \binom{n}{i}^2 \times i! \]

发现 \(g\) 不是很好求,只能考虑组合意义递推。

\[g_n=2n\times g_{n-1}-(n-1)^2\times g_{n-2} \]

前一项是考虑第 \(n\) 行和第 \(n\) 列选一个或不选的方案数。

后一项是减去算重的第 \(n\) 行和第 \(n\) 列各选一个的方案数。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e7+10,mod=1e9+7;
int n,g[N],fac[N],ifac[N];
ll qpow(ll x,ll y=mod-2){
	ll ans=1;
	for(;y;(x*=x)%=mod,y>>=1)if(y&1)(ans*=x)%=mod;
	return ans;
}
void init(){
	for(int i=fac[0]=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
	ifac[n]=qpow(fac[n]);
	for(int i=n;i>=1;i--)ifac[i-1]=1ll*ifac[i]*i%mod;
}
int C(int n,int m){
	if(0>m||m>n)return 0;
	return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int main(){
	freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n,init();
	g[0]=1,g[1]=2;
	for(int i=2;i<=n;i++){
		g[i]=(2ll*i*g[i-1]+(mod-i+1ll)*(i-1)%mod*g[i-2])%mod;
	}
	int ans=0;
	for(int i=0;i<=n;i++){
		int val=i&1?mod-1:1;
		ans=(ans+1ll*val*fac[i]%mod*C(n,i)%mod*C(n,i)%mod*g[n-i]%mod*g[n-i])%mod;
	}
	cout<<ans;
	return 0;
}

标签:ifac,LOJ,ll,初赛,times,zhengjun,int,ans,mod
From: https://www.cnblogs.com/A-zjzj/p/17558355.html

相关文章

  • HHHOJ #1247. 「NOIP 2023 模拟赛 20230715 A」1 题解--zhengjun
    法老找来的题,说是找了三道其他模拟赛的T4拼成T1~T3,另外搞了道T4。思维好题,但是放在T1有点搞心态,但是还好大样例够强,400没挂。然而T3大样例输出错了,浪费了我0.5h,差评。首先发现向左走之后向右走是一定不优的,所以最短路的情况只能先向右再向左。考虑枚举起点\(s......
  • [YDRG#001] 提瓦特环游记 · 云斗杯 · 七月 Golden 组模拟赛 整理分析--zhengjun
    link总体评价:因为K了,所以好评,练一下思维蛮好的,质量不错比赛2.5hK的。#A.诗人小G初进OI界标准送分,输出\(\frac{s_2-a_2}{a_1}\)。#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;intn,a[N];voidread(ll&x){ char......
  • P5044 [IOI2018] meetings 会议 思考--zhengjun
    在NFLS模拟赛上遇到的,赛后订正过的。隔了蛮长时间的,总结一下。首先转化为笛卡尔树上后缀前缀的问题。然后考虑如何转移,发现转移形如\(f(x)=\min\{f(x)+C,kx+b\}\)的形式。可以直接线段树维护每个点的最优直线,在update的时候:如果\(f(x)+C\lekx+b\)恒成立(左右......
  • CF1220F Gardener Alex 题解--zhengjun
    发现根节点一定是\(1\),所以考虑两边的子树深度,然后发现只需要考虑一段后缀或前缀的深度即可。所以循环位移后,可以从中间往两边构建笛卡尔树,实时维护深度即可。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=2e5+10;intn,a[N],ans[N];......
  • CF1175F The Number of Subpermutations 对自己的警告--zhengjun
    太久没见过启发式合并了,然后没想出做法。首先笛卡尔树建出来。然后直接枚举跨过\(mid\)的长度为\(a_{mid}\)的区间,RMQ\(O(1)\)验证即可。发现这样的区间个数不超过左右区间大小的较小值,时间复杂度:\(O(n\logn)\)。代码#include<bits/stdc++.h>usingnamespacestd;us......
  • P5979 [PA2014] Druzyny 总结--zhengjun
    思维妙妙题。首先发现\(d\)的限制满足单调性,所以可以转化为\(l\gep_r\)的限制。注意:\(p\)是单调不降的然后就是\(p_r\lel\ler,\max\limits_{i=l}^r\{c_i\}\ler-l+1\)。这个\(\max\)想到转化到笛卡尔树上操作。然而这题要需要一个dp,所以考虑类似cdq分治一样......
  • CF1290E Cartesian Tree 注意点--zhengjun
    解题思路容易想到从小到大加数,维护每个点的子树大小。可转化为维护每个点为\(\max\)时的\([L,R]\)区间。然后需要写一个支持【区间+1】、【区间取min】、单点加入、全局查询。上个吉司机线段树即可。注意点吉司机线段树下推\(fi\)的标记的时候要注意\(fi\)的变化......
  • 2021 robocom 世界机器人开发者大赛-本科组(初赛)
    7-1懂得都懂题目描述:7-1懂的都懂众所周知,在互联网上有很多话是不好直接说出来的,不过一些模糊的图片仍然能让网友看懂你在说什么。然而对这种言论依然一定要出重拳,所以请你实现一个简单的匹配算法。现在我们采集了原图的一些特征数据,由N个小于255的非负整数组成,假设对于......
  • P8339 [AHOI2022] 钥匙 思考--zhengjun
    很容易考虑到计算贡献。该问题的关键在于——如何使得钥匙和宝箱的对应关系不算重Warning:有这样的二元对应关系,可以考虑一下转化为括号序列!转化为括号序列之后,发现路径上括号串的对应关系能够预处理出来。套个虚树和扫描线,就做完了。代码#include<bits/stdc++.h>using......
  • P4606 [SDOI2018] 战略游戏 对自己的警告--zhengjun
    tarjan多测的时候dfn数组要清空!!!树剖多测的时候son数组要清空!!!点双tarjan时可用vector建边,边双时用vector需要无重边本题直接建圆方树,然后答案就是关键点构成的虚树上非关键原点个数。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;......