G - Cheerleaders (UVA - 11806)
阿新 • • 發佈:2018-02-14
brush end 判斷 最後一行 for gpo cpp using mes
- 題目大意
本題大致意思是講:給定一個廣場,把它分為M行N列的正方形小框。現在給定有K個拉拉隊員,每一個拉拉隊員需要站在小框內進行表演。但是表演過程中有如下要求:
(1)每一個小框只能站立一個拉拉隊員;
(2)廣場的第一行,最後一行,第一列,最後一列都至少站有一個拉拉隊員;
(3)站在廣場的四個角落的拉拉隊員可以認為是同時占據了一行和一列。
- 解題思路
利用容斥原理來解決,將不滿足條件的一一剔除,(我的方法比較笨重,如果選擇二進制來判斷做起來就比較輕松了)。
- 代碼
#include<iostream> using namespace std; const long long mod =1000007; const int MAX = 500; long long num[MAX][MAX]; void zh() { for (long long i = 0; i < MAX; i++) { num[i][0] = num[i][i] = 1; for (long long j = 1; j < i; j++) { num[i][j] = (num[i - 1][j - 1] + num[i - 1][j]) % mod; } } } int main() { int t, m, n,k; cin >> t; zh(); for (int i = 1; i <= t; i++) { long long sum = 0; cin >> n>> m>>k; cout << "Case " << i << ": "; if (k > m*n) { cout << sum << endl; continue; } sum= (num[m*n][k]-(2 * (num[(n - 1)*m][k] + num[n*(m - 1)][k]) - (num[(n - 2)*m][k] + num[n*(m - 2)][k]) + 2 * (num[(n - 1)*(m - 2)][k] + num[(n - 2)*(m - 1)][k]) - num[(n - 2)*(m - 2)][k]-4 * num[(n - 1)*(m - 1)][k])); while (sum < 0) sum += mod; sum %= mod; cout << sum << endl; } return 0; }
G - Cheerleaders (UVA - 11806)