[JSOI2015]染色游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[JSOI2015]染⾊游戏
Description
棋盘是⼀个n×m的矩形,分成n⾏m列共n*m个⼩⽅格。
现在萌萌和南南有C种不同颜⾊的颜料,他们希望把棋盘⽤这些颜料染⾊,并满⾜以下规定:
1.棋盘的每⼀个⼩⽅格既可以染⾊(染成C种颜⾊中的⼀种),也可以不染⾊。
2.棋盘的每⼀⾏⾄少有⼀个⼩⽅格被染⾊。
3.棋盘的每⼀列⾄少有⼀个⼩⽅格被染⾊。
4.每种颜⾊都在棋盘上出现⾄少⼀次。
请你求出满⾜要求的不同的染⾊⽅案总数。
只要存在⼀个位置的颜⾊不同,
即认为两个染⾊⽅案是不同的
Input
输⼊只有⼀⾏ 3 个整数n,m,c。
1 < = n,m,c < = 400
Output
输出⼀个整数,为不同染⾊⽅案总数。
因为总数可能很⼤,只需输出总数mod 1,000,000,007的值。
Sample Input
2 2 3
Sample Output
60
题解
容斥
枚举⾄多有k种颜⾊被使⽤
然后发现还是不能求出答案
那就继续容斥
⾄多i⾏被染⾊
⾄多j列被染⾊
然后答案就是(−1)n+m+c−i−j−k×C i n×C j m×C k c×(k+1)i×j
代码
#include<cstdio>
const int M = 405 ;
const int mod = 1e9 + 7 ;
using namespace std ;
int n , m , c , ans , C[M][M] , pw[M][M * M] ;
int main() {
scanf("%d%d%d",&n,&m,&c) ;
for(int i = 0 ; i <= 400 ; i ++) {
C[i][0] = 1 ;
for(int j = 1 ; j <= i ; j ++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod ;
}
for(int i = 1 ; i <= c + 1 ; i ++) {
pw[i][0] = 1 ;
for(int j = 1 ; j <= n * m ; j ++) pw[i][j] = 1LL * pw[i][j - 1] * i % mod ;
}
for(int i = n ; i >= 0 ; i --)
for(int j = m ; j >= 0 ; j --)
for(int k = c ; k >= 0 ; k --)
ans = (ans + 1LL * ( (n + m + c - i - j - k) % 2 ? ( mod - 1 ) : 1 ) * C[n][i] % mod * C[m][j] % mod * C[c][k] % mod * pw[k + 1][i * j] % mod) % mod ; printf("%d\n",ans) ;
return 0 ;
}
Processing math: 100%。