题目:
给定矩形长宽 n, m。给定拉拉队员个数,要求求出四个边上至少有一个人的排列数。要求对1000007取模。
思路:
这题是简单的容斥原理题,但是容易在取模的时候出现负数而wa(我wa了4发,我好菜), 其他的就是简单的容斥。可以先将组合数的模排列组合打表出来。
代码:
#include <bits/stdc++.h>
#define MOD 1000007
#define LL long long
using namespace std;
LL Clist[ 401 ][ 501 ] ;
LL answer[ 10001 ];
void C( ) {
int i, j;
Clist[ 1 ][ 0 ] = 1;
Clist[ 1 ][ 1 ] = 1;
for( i = 2; i <= 400; i ++ ) {
for( j = 0; j <= i; j ++ ) {
if( j == 0 ) {
Clist[ i ][ j ] = 1;
} else {
Clist[ i ][ j ] = Clist[ i - 1 ][ j - 1 ] + Clist[ i - 1 ][ j ];
Clist[ i ][ j ] %= MOD;
}
//if( i < 25 ) printf("%d\t", Clist[ i ][ j ] );
}
//if( i < 25 ) cout << endl;
}
return;
}
int main( ) {
int T, M, N, K, t;
int i, j, k;
long long ans;
C( );
cin >> T;
for( t = 1; t <= T; t ++ ) {
cin >> M >> N >> K;
ans = Clist[ M * N ][ K ];
ans -= ( 2 * Clist[ ( M - 1 ) * N ][ K ] ) % MOD;
ans -= ( 2 * Clist[ M * ( N - 1 ) ][ K ] ) % MOD;
ans += ( 4 * Clist[ ( M - 1 ) * ( N - 1 ) ][ K ] ) % MOD;
ans += ( Clist[ ( M - 2 ) * N ][ K ] ) % MOD;
ans += ( Clist[ M * ( N - 2 ) ][ K ] ) % MOD;
ans -= ( 2 * Clist[ ( M - 2 ) * ( N - 1 ) ][ K ] ) % MOD;
ans -= ( 2 * Clist[ ( M - 1 ) * ( N - 2 ) ][ K ] ) % MOD;
ans += ( Clist[ ( M - 2 ) * ( N - 2 ) ][ K ] ) % MOD;
ans %= MOD;
ans += MOD;
ans %= MOD;
if( K == 0 ) ans = 0;
answer[ t ] = ans;
}
for( t = 1; t <= T; t ++ ) {
printf( "Case %d: %lld\n", t, answer[ t ] );
}
}