zoukankan      html  css  js  c++  java
  • CF1228E Another Filling the Grid

    题目链接

    问题分析

    比较显见的容斥,新颖之处在于需要把横竖一起考虑……

    可以枚举没有(1)的行数和列数,答案就是

    [sumlimits_{i=0}^nsumlimits_{j=0}^m(-1)^{i+j}{nchoose i}{n choose j}(k-1)^{i*n+j*n-i*j}k^{n*n-i*n-j*n+i*j} ]

    个数算对就好了……

    参考程序

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
     
    const LL Mod = 1000000007;
    const LL Maxn = 260;
    LL n, k;
    LL Fact[ Maxn ], INV[ Maxn ];
     
    LL Pow( LL x, LL y ) {
    	LL Ans = 1;
    	for( ; y; y >>= 1, x = x * x % Mod )
    		if( y & 1 )
    			Ans = Ans * x % Mod;
    	return Ans;
    }
     
    LL C( LL n, LL m ) {
    	return Fact[ n ] * INV[ m ] % Mod * INV[ n - m ] % Mod;
    }
     
    int main() {
    	Fact[ 0 ] = 1;
    	for( LL i = 1; i < Maxn; ++i ) Fact[ i ] = Fact[ i - 1 ] * i % Mod;
    	INV[ Maxn - 1 ] = Pow( Fact[ Maxn - 1 ], Mod - 2 );
    	for( LL i = Maxn - 2; i >= 0; --i ) INV[ i ] = INV[ i + 1 ] * ( i + 1 ) % Mod;
     
    	scanf( "%lld%lld", &n, &k );
    	LL Ans = 0;
    	for( LL i = 0; i <= n; ++i )
    		for( LL j = 0; j <= n; ++j ) {
    			LL Num = ( i + j ) * n - i * j;
    			LL t1 = C( n, i ) * C( n, j ) % Mod;
    			LL Method = t1 * Pow( k - 1, Num ) % Mod * Pow( k, n * n - Num ) % Mod;
    			if( ( i + j ) % 2 == 0 ) Ans = ( Ans + Method ) % Mod; 
    			else Ans = ( Ans + Mod - Method ) % Mod;
    		}
    	printf( "%lld
    ", Ans );
    	return 0;
    }
    
    
  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/chy-2003/p/11617511.html
Copyright © 2011-2022 走看看