UVA 11806 - 치어 리더 (용 척 원리)

2536 단어 uva
전송 문: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=226&page=show_problem&problem=2906
 
제목: n * m 의 격자 를 드 리 겠 습 니 다. k 개의 돌 을 놓 습 니 다. 각 격자 에 최대 한 개의 돌 을 놓 습 니 다. 첫 번 째 줄, 마지막 줄, 첫 번 째 열, 마지막 열 에 모두 돌 이 있 습 니 다. k 개의 돌 을 놓 는 데 몇 가지 방법 이 있 는 지 물 어보 세 요.
문제 풀이: 용 척 원 리 를 이용 하여 전집 을 S 로 설정 하고 첫 번 째 줄 에 돌 이 없 는 A, 마지막 줄 에 돌 이 없 는 B, 첫 번 째 열 에 돌 이 없 는 C, 마지막 열 에 돌 이 없 는 D,
그럼 정 답 은 S 에 있 지만 ABCD 에 있 지 않 습 니 다.
 
AC 코드:
#include <iostream>

#include <cstdio>

#include <cstring>

#include <string>

#include <cstdlib>

#include <cmath>

#include <vector>

#include <list>

#include <deque>

#include <queue>

#include <iterator>

#include <stack>

#include <map>

#include <set>

#include <algorithm>

#include <cctype>

using namespace std;



#define si1(a) scanf("%d",&a)

#define si2(a,b) scanf("%d%d",&a,&b)

#define sd1(a) scanf("%lf",&a)

#define sd2(a,b) scanf("%lf%lf",&a,&b)

#define ss1(s)  scanf("%s",s)

#define pi1(a)    printf("%d
",a) #define pi2(a,b) printf("%d %d
",a,b) #define mset(a,b) memset(a,b,sizeof(a)) #define forb(i,a,b) for(int i=a;i<b;i++) #define ford(i,a,b) for(int i=a;i<=b;i++) typedef long long LL; const int N=501; const int mod=1000007; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-7; int C[N][N]; int main() { mset(C,0); forb(i,0,N) { C[i][0]=C[i][i]=1; // forb(j,1,i) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; } int T,ca=0; si1(T); while(T--) { int n,m,k; si1(n);si2(m,k); int sum=0; forb(i,0,16) { int b=0,r=n,c=m; //r/c ,b if(i&1){r--;b++;} // , -1 if(i&2){r--;b++;} if(i&4){c--;b++;} if(i&8){c--;b++;} if(b&1) sum=(sum-C[r*c][k]+mod)%mod; // else sum=(sum+C[r*c][k])%mod; // } printf("Case %d: %d
",++ca,sum); } return 0; }

 

좋은 웹페이지 즐겨찾기