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;
    }
    
  • 相关阅读:
    Getting Started with Recovery Manager (RMAN) (文档 ID 360416.1)
    enctype的2个值
    laravel 去掉资源的顶层包裹 withoutWrapping方法
    hash_equals(),防止时序攻击,字符串比较函数
    moment.js 处理“几天前”,“几个月前”
    redis hash 应用场景
    vue 3个插槽示例(具名插槽)
    vue 插槽的基本使用
    redis hash
    redis 分布式系统全局序列号
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/cf589e.html
Copyright © 2011-2022 走看看