首页 > 其他分享 >CF111D Petya and Coloring 题解

CF111D Petya and Coloring 题解

时间:2024-02-28 13:12:14浏览次数:198  
标签:md Coloring return 题解 ll choose ans CF111D S1

很明显这是一道组合题。

首先特判一下,当 \(m=1\) 时,答案就是 \(k^n\)。

对于 \(m>1\) 的情况,我们可以得出一个结论:

对于沿格子的线穿过的任何垂直线,会将棋盘分成两个非空的部分,这两个部分中的不同颜色的数量相同且总是不变。设这个不同颜色的数量为 \(i\),那么左边这部分的颜色一定是固定的 \(i\) 种颜色,右边那部分也一定是固定的 \(i\) 种颜色。

由于分开前两列的垂线的左边部分只有第一列的格子,所以左边的 \(i\) 种颜色中的每一种都一定至少会在第一列中出现一次,最后一列同理。

我们设左边的颜色为集合 \(S1\),右边的颜色为集合 \(S2\),\(|S1|=|S2|=i\),那么中间的 \(m-2\) 列能染的颜色的种数为 \(|S1\cap S2|\)。

我们可以先枚举 \(i\),再枚举 \(|S1\cap S2|\) (设其为 \(j\)),那么 \(S1\) 和 \(S2\) 就总共有 \({k \choose j}{k-j \choose i-j}{k-i \choose i-j}\) 种取法,给中间 \(m-2\) 列染色的方案数为 \(j^{(m-2)n}\),给前后两列染色的方案数可以用容斥得出。

我们设 \(f(m)\) 表示给 \(n\) 个格子染 \(m\) 种颜色每一种颜色都至少出现一次的方案数,我们用容斥得出 \(f(m)\):

\[f(m)=\sum_{i=0}^{m} (-1)^i\times {m\choose i}(m-i)^n \]

整理得到最终的答案:

\[\sum_{i=1}^{min(k,n)} f(i)^2\times \sum_{j=0}^{i} {k \choose j}{k-j \choose i-j}{k-i \choose i-j}\times j^{(m-2)n} \]

这个值可以在 \(O(n^2(\log n+\log m))\) 的时间复杂度内得到。

代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 1000003
#define md 1000000007
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
int n,m,k,xi,inv[mxn],fac[mxn],ifac[mxn];
ll ans;
inline ll C(int n,int m){
	if(m>n)return 0;
	return (ll)fac[n]*ifac[n-m]%md*ifac[m]%md;
}
inline ll power(ll x,int y){
	ll ans=1;
	for(;y;y>>=1){
		if(y&1)ans=ans*x%md;
		x=x*x%md;
	}
	return ans;
}
inline ll p2(ll x){
	return x*x%md;
}
ll color(int n,int m){
	ll ans=0;
	xi=1;
	rep(i,0,m){
		ans=(ans+C(m,i)*power(m-i,n)%md*xi)%md;
		xi*=-1;
	}
	return ans;
}
signed main(){
	cin>>n>>m>>k;
	if(m==1){
		cout<<power(k,n);
		return 0;
	}
	inv[1]=fac[1]=ifac[1]=1;
	fac[0]=ifac[0]=1;
	rep(i,2,1000000){
		inv[i]=(ll)inv[md%i]*(md-md/i)%md;
		fac[i]=(ll)fac[i-1]*i%md;
		ifac[i]=(ll)ifac[i-1]*inv[i]%md;
	}
	rep(i,1,min(n,k)){
		xi=p2(color(n,i));
		rep(j,0,i)ans=(ans+C(k,j)*C(k-j,i-j)%md*C(k-i,i-j)%md*xi%md*power(j,(m-2)*n))%md;
	}
	cout<<(ans+md)%md;
	return 0;
}

标签:md,Coloring,return,题解,ll,choose,ans,CF111D,S1
From: https://www.cnblogs.com/zifanoi/p/18039982

相关文章

  • [USACO13MAR]Farm Painting S 题解
    看大家好多写的都用了四维偏序,给一个不用偏序的解法。简化一下题目,就是给你\(n\)个矩形,第\(i\)个矩形用\((x1_i,y1_i,x2_i,y2_i)\)表示,问你有多少个\(i\)满足:不存在另一个\(j\)使得\(x1_j\lex1_i\lex2_j\wedgey1_j\ley1_i\ley2_j\)。我们从左到右扫描每一个......
  • CF799D题解
    CF799D这里更容易进入且有翻译题意给定一个长宽为\(a\)和\(b\)的目标矩形、一个宽高为\(h\)和\(w\)的初始矩形及\(n\)个操作\(a_i\)。对于每个操作,可以将初始矩形的宽或高乘以\(a_i\),求使目标矩形能放入初始矩形的最少操作(目标矩形可以旋转90度)。解析这题算是......
  • [ABC303Ex] Constrained Tree Degree 题解
    AtCoder题面洛谷题面如果每个点的度数都知道了,那问题就转化成了P2290[HNOI2004]树的计数,直接求Prufer序列的个数即可,因为一个度数为\(d_i\)的点在Prufer序列中的出现次数是\(d_i-1\),所以答案是:\(\frac{(n-2)!}{\prod_{i=1}^{n}(d_i-1)!}\)。可以把\((n-2)!\)放到......
  • [COI2009] PLAHTE 题解
    首先对于每一个矩形,若\(x_2<0\),就将\(x_1,x_2\)均乘上\(-1\)再交换,对于\(y_1,y_2\)也做同样的操作。我们建立一个操作序列a[0~1000],和一个数组\(d\),每一个操作用\((x,y)\)表示,就是在\(d\)内把所有\(0\)到\(x\)的位置加上\(y\)。我们再定义一种新的操作\([x,y......
  • [USACO11NOV]Binary Sudoku G 题解
    定义一个\(3\times3\)的表格\(a\),表示每个小九宫格内1的个数的奇偶状态。再定义两个长为\(9\)的数组\(c0,c1\),表示每行每列上1的个数的奇偶状态。当\(d_{i,j}\)取反时,会将\(a_{[\frac{i}{3}],[\frac{j}{3}]},c0_i,c1_j\)各取反一次。要将\(a_{i,j}\)全部变为0......
  • [ABC286Ex] Don't Swim 题解
    我们首先求出线段与多边形的交点,如果交点个数\(<2\)或者有无数个交点,则可以直接输出\(S\)到\(T\)之间的距离。接下来我们考虑交点个数为\(2\)的情况。为了方便,我们记距离\(S\)最近的那个交点为\(P_1\),远的为\(P_2\)。举个例子:在这个例子中,直线\(ST\)将整个多边......
  • P3577 [POI2014]TUR-Tourism 题解
    考虑在无向图上进行dfs,可以得到很多棵dfs树(因为图不一定连通),这些树形成了一个森林。然后由任意两点间不存在节点数超过\(10\)的简单路径这个限制可以得出这些树的深度都不超过\(10\),然后可以想到树上状压dp。有一个重要的性质,就是无向图dfs树上的非树边,一定是回边,所以......
  • CF516E Drazil and His Happy Friends 题解
    题目传送门记\(d=\gcd(n,m)\),发现只有编号在模\(d\)意义下相同的人之间会产生影响,那么有解当且仅当每个剩余系内有至少一个人是快乐的。所以在\(d>b+g\)时直接输出-1即可。对于剩下的情况,先令\(n\leftarrow\fracnd,m\leftarrow\fracmd\),如果\(n<m\)那么把男女交......
  • [ARC140F] ABS Permutation (Count ver.) 题解
    洛谷题面传送门AT题面传送门发现不太好直接求,考虑将\(P\)映射到\(P^{-1}\)上,这样题目中的条件就变成了\(|P_i-P_{i+M}|=1\)。因此我们可以对模\(M\)的每个剩余系做\(M=1\)的情况,然后最后快速幂合并。考虑\(M=1\)的情况怎么做。记\(f_i\)表示\(K=i\)的方案数,......
  • [ARC112F] Die Siedler 题解
    题目传送门人类智慧题。发现\(2\)操作肯定是不劣的,所以能换则换。考虑将手上的牌转换成一个多进制的数,这样\(2\)操作就是其进位方法,\(1\)操作就是将当前的数加上牌包对应的数,答案就是其各位数字之和,不难发现其值为:\[\sum_{i=1}^nc_i\times2^{i-1}\times(i-1)!\]再考......