zoukankan      html  css  js  c++  java
  • 【bzoj4487】[Jsoi2015]染色问题 容斥原理

    题目描述

    棋盘是一个n×m的矩形,分成n行m列共n*m个小方格。现在萌萌和南南有C种不同颜色的颜料,他们希望把棋盘用这些颜料染色,并满足以下规定: 
    1.  棋盘的每一个小方格既可以染色(染成C种颜色中的一种) ,也可以不染色。 
    2.  棋盘的每一行至少有一个小方格被染色。 
    3.  棋盘的每一列至少有一个小方格被染色。 
    4.  种颜色都在棋盘上出现至少一次。 
    以下是一些将3×3棋盘染成C = 3种颜色(红、黄、蓝)的例子:

    请你求出满足要求的不同的染色方案总数。只要存在一个位置的颜色不同,即认为两个染色方案是不同的

    输入

    输入只有一行 3 个整数 n,m,c 。1 < = n,m,c < = 400

    输出

    输出一个整数,为不同染色方案总数。因为总数可能很大,只需输出总数
    mod 1,000,000,007的值。

    样例输入

    2 2 3

    样例输出

    60


    题解

    容斥原理

    题目要求:所有行都有格子被染色、所有列都有格子被染色、所有颜色都有格子被染色的方案数。

    我们可以容斥一下,求:有 $i$ 行没有格子被染色、有 $j$ 列没有格子被染色、有 $k$ 种颜色没有格子被染色的方案数。

    那么答案为 $sumlimits_{i=0}^nsumlimits_{j=0}^msumlimits_{k=0}^c(-1)^{i+j+k}C_n^iC_m^jC_c^kk^{(n-i)(m-j)}$ 。

    由于 $n,m,c$ 都只有400,因此不需要做进一步推导,直接预处理组合数+幂,暴力计算即可。

    时间复杂度 $O(n^3)$

    #include <cstdio>
    #include <algorithm>
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    ll c[410][410] , pow[160010];
    int main()
    {
    	int n , m , p , i , j , k;
    	ll ans = 0;
    	scanf("%d%d%d" , &n , &m , &p);
    	pow[0] = c[0][0] = 1;
    	for(i = 1 ; i <= n || i <= m || i <= p ; i ++ )
    	{
    		c[i][0] = 1;
    		for(j = 1 ; j <= i ; j ++ )
    			c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
    	}
    	for(i = 0 ; i <= p ; i ++ )
    	{
    		for(j = 1 ; j <= n * m ; j ++ ) pow[j] = pow[j - 1] * (p - i + 1) % mod;
    		for(j = 0 ; j <= n ; j ++ )
    			for(k = 0 ; k <= m ; k ++ )
    				ans = (ans + c[p][i] * c[n][j] % mod * c[m][k] % mod * pow[(n - j) * (m - k)] % mod * ((i ^ j ^ k) & 1 ? -1 : 1) + mod) % mod;
    	}
    	printf("%lld
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    HyperLogLog
    Bitmaps
    正向代理与反向代理的概念
    性能优化——应用服务器性能优化
    Memcached的优点
    前端基础之BOM和DOM
    性能优化——Web前端性能优化
    亡命逃窜---三维搜索
    Sum It Up -- 深搜 ---较难
    排序---对二维数组的排序
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/8297567.html
Copyright © 2011-2022 走看看