# 589 (사업부. 2) -E 라운드 Codeforces. 또 다른 그리드 - 포함과 배제 정리를 작성

# 589 (사업부. 2) -E 라운드 Codeforces. 또 다른 그리드 - 포함과 배제 정리를 작성


【문제 설명】

에서 (n \ 시간 n \) \ 채워진 격자 \ (\ [K 1]) 수와 각 행이 있는지 확인 적어도 하나 \ (1 \) 갖는 각 열의 적어도 하나 \ (1 \ ) , 조건을 충족하기 위해 얼마나 많은 패딩 방식을 요구했다.

【해결책】

주문 \ (R은 [I]가 \) 제 위해 나타내는 \ (I는 \) 라인은 적어도 하나의 보유 \ (1 \)를 프로그램의 수이다 \은 (C [I]는 \) 대표 \ (나는 \) (A)에서 포함 \ (1 \) 프로그램의 수. 피사체의 요구되는 \ (\ bigcap_. 1} = {I ^ nR 개의 [I]를 \ CAP C [I] \) . 포함 및 배제 정리 저자 :
\ [\ sum_ I = {0}} ^ {N- \ sum_ J = {0}} ^ {N - (- 1) ^ {I가 + J} \ {N-CDOT \ 선택 J} \ CDOT \ cdot {n \ I 선택} \의 cdot (K-1) ^ {n 개의 \의 cdot (나는 J를 +) - {N 개의 \의 cdot (나는 J +) + 난 cdot의 J를 \ n ^ 2} - K ^ I \ cdot j는} \]
나타내는 \ (\ N-) 그룹으로부터 선택된 행 \ (나는 \) 행에서 \ (\ N-) 컬럼 선택 \ (J \) 열 선택 (\ n 개의 \의 cdot (나는 + J)를 - 난 \ cdot J \) 격자 넣을 수 \ (1 \) 격자 가지고 ^ \ ((K-1) {N 개의 \의 cdot (나는 J +) -i \ cdot J} \) 시드 배치 프로그램 및 남은 \ (N ^ 2 N 개의 \의 cdot는 (ⅰ J +) + 난 cdot의 j 개의 \를 \) 한\ (K ^ {N ^ 2 -n의 \의 cdot (난과 j) + i가 cdot의 J를 \} \) 시드 배치 방식.


【암호】

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef int Int;
#define int long long 
#define maxn 1005
#define INF 0x3f3f3f3f
const int mod=1e9+7;
int bit[maxn][maxn];
int fpow(int a,int b){
    int ans=1;a%=mod;
    while(b){
        if(b&1) (ans*=a)%=mod;
        (a*=a)%=mod;
        b>>=1;
    }
    return ans;
}
Int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k;cin>>n>>k;
    for(int i=0;i<=n;i++) bit[i][0]=1;
    for(int i=1;i<=n;i++){ //预处理组合数
        for(int j=1;j<=i;j++){
            bit[i][j]=(bit[i-1][j]+bit[i-1][j-1])%mod;  
        }
    }
    int ans=0;
    for(int i=0;i<=n;i++){ //直接套公式即可
        for(int j=0;j<=n;j++){
            ans+=((i+j)&1?-1:1)*bit[n][i]%mod*bit[n][j]%mod*fpow(k,n*n-n*(i+j)+i*j)%mod*fpow(k-1,n*(i+j)-i*j)%mod;
            ans%=mod;
        }   
    }
    cout<<(ans+mod)%mod<<endl;
    return 0;
}

추천

출처www.cnblogs.com/--Simon/p/11615228.html