zoukankan      html  css  js  c++  java
  • 【CF589 E】Another Filling the Grid

    一个很套路的容斥裸题,这里记录一下scb 的切题过程

    Description

      有一个 (n imes n) 的矩阵,你需要往每格里填一个 ([1,k]) 的整数,使得每一行、每一列的最小值都是 (1)。求方案数。
      (nle 250)
      (kle 10^9)

    Solution

      这题可以 (O(n)) 做……不知道这数据范围是什么鬼……

      考虑消除掉一维影响后容斥。
      预处理一个函数 (f(i)) 表示填满 (i imes n) 的网格,满足每一列填了至少一个 (1) 的方案数。
      显然 (f(0)=0)(f(i) = (k^i - (k-1)^i)^n)(k^i - (k-1)^i) 表示任意填充一列的方案数 减去这一列没有 (1) 的方案数,那么这一列就至少有一个 (1) 咯。

      下面所有统计的情况都是满足列限制的。我们考虑对行限制容斥,用总方案数减去不合法的方案数。
      即
    (egin{align} ans = &不对行作限制的方案数 - 第 1 行没有 1 的方案数 - 第 2 行没有 1 的方案数 - 第 3 行没有 1 的方案数 - cdots onumber \ &- 第 n 行没有 1 的方案数 + 第 1,2 行没有 1 的方案数 + 第 1,3 行没有 1 的方案数 +cdots onumber end{align})
      即 (ans = sumlimits_{i=0}^n (-1)^i C_n^i (k-1)^{ni} f(n-i))
      解释一下,就是钦定 (i) 行不能有 (1)(显然有 (C_n^i) 种钦定方案),然后填充其余 (n-i) 行的条件是每一列上都有 (1)
      (O(n)) 计算即可。

      还有一道配套容斥题,但并不能公开。

    #include<bits/stdc++.h>
    #define ll long long
    #define N 251
    #define mod 1000000007
    using namespace std;
    inline int read(){
    	int x=0; bool f=1; char c=getchar();
    	for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
    	for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
    	if(f) return x; return 0-x;
    }
    int n,k,f[N],fac[N],ifac[N],ans;
    int Pow(int x, int y){
    	int ret=1;
    	while(y){
    		if(y&1) ret=(ll)ret*x%mod;
    		x=(ll)x*x%mod;
    		y>>=1;
    	}
    	return ret;
    }
    inline int C(int n, int m){
    	return (ll)fac[n] * ifac[m] % mod * ifac[n-m] % mod;
    }
    inline void upd(int &x, int y){
    	x = (x+y) % mod;
    }
    int main(){
    	n=read(), k=read();
    	fac[0]=1;
    	for(int i=1; i<=n; ++i){
    		f[i] = Pow((Pow(k,i)-Pow(k-1,i)+mod)%mod, n),
    		fac[i] = (ll)fac[i-1] * i % mod;
    	}
    	ifac[n] = Pow(fac[n], mod-2);
    	for(int i=n-1; i>=0; --i) ifac[i] = (ll)ifac[i+1] * (i+1) % mod;
    	for(int i=0; i<=n; ++i) upd(ans, ((i&1)?mod-1ll:1ll) * C(n,i) % mod * Pow(k-1,(ll)n*i) % mod * f[n-i] % mod);
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/cf589e.html
Copyright © 2011-2022 走看看