1004ios
咱們考慮一下,首先奇數的不可能有效spa
首先,若是是奇*奇,顯然怎麼構造都行blog
若是奇*偶,那麼只有偶數的有效,奇數不可能有效input
那麼偶數就()()()這樣就行了string
因此咱們考慮偶數*偶數的it
咱們分兩種狀況:io
1,咱們第一行,第一列,最後一行最後一列都不要了class
這狀況下stream
咱們能夠構造一個這樣的date
((((((((
()()()()
(()()())
.........
))))))))
也就是說,第一行第一列放(
最後一行一列)
交界處無所謂
而後剩下的()交替,確定數量相等並且兩兩抵消
方案數n+m-4
---------------------------------
還有一個狀況是這樣
((((((
)()()(
()()()
))))))
這樣的話,咱們發現
6列所有知足,此外咱們造了一行知足的
咱們發現,第一行必定是(,最後一行必定是),其他的咱們能夠知足一半的行數
用這種辦法構造,咱們獲得的答案是n+(m-2)/2的
二者取max便可
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int main() { int t; scanf("%d",&t); int zu; for (zu=0;zu<t;zu++) { int n,m; scanf("%d%d",&n,&m); if ((n%2==0)&&(n>=8)&&(m%2==0)&&(m>=8)) { int i,j; for (j=0;j<m;j++) { printf("("); } printf("\n"); for (i=1;i<n-1;i++) { printf("("); int j; for (j=1;j<m-1;j++) { if ((i+j)%2==0) { printf("("); } else { printf(")"); } } printf(")"); printf("\n"); } for (j=0;j<m;j++) { printf(")"); } printf("\n"); continue; } int val_n=n,val_m=m; if (n%2==1) val_m=-1; if (m%2==1) val_n=-1; int j; if (val_n>val_m) { int i; for (i=0;i<n;i++) { for (j=0;j<m;j++) { if (j==0) { printf("("); } else if (j==m-1) { printf(")"); } else if ((i%2==0)&&(j%2==1)) { printf(")"); } else if ((i%2==1)&&(j%2==0)) { printf(")"); } else { printf("("); } } printf("\n"); } } else { int i; for (i=0;i<n;i++) { for (j=0;j<m;j++) { if (i==0) { printf("("); } else if (i==n-1) { printf(")"); } else if ((j%2==0)&&(i%2==1)) { printf(")"); } else if ((j%2==1)&&(i%2==0)) { printf(")"); } else { printf("("); } } printf("\n"); } } } return 0; }
============================================
1011
咱們直接暴力枚舉哪些行要扎掉一個氣球,而後開dp....
複雜度有點高,不過反正過了對不對
要寫個高精度差評........
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char c[15][25]; long long dp[25][1<<12]; long long ans[25]; struct bigint { int a[65]; bigint () { memset(a,0,sizeof(a)); } bigint (long long x) { memset(a,0,sizeof(a)); int i; for (i=0;x!=0;i++) { a[i]=x%10; x/=10; } } int & operator [] (const int x) { return a[x]; } int operator [] (const int x) const { return a[x]; } friend bigint operator * (const bigint &a,const bigint &b) { bigint c; int i,j; for (i=0;i<30;i++) { for (j=0;j<30;j++) { c[i+j]+=a[i]*b[j]; } } for (i=0;i<60;i++) { c[i+1]+=c[i]/10; c[i]%=10; } return c; } void output() { int i; for (i=60;i>0;i--) { if (a[i]!=0) break; } for (;i>=0;i--) { printf("%d",a[i]); } printf("\n"); } }; int down_val[1<<12]; int cnts[1<<12]; bool must_update[25]; bool empty[25]; int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int t; scanf("%d",&t); int zu; int i,j; for (i=0;i<12;i++) { down_val[(1<<i)]=i; } for (i=0;i<(1<<12);i++) { int j; for (j=0;j<12;j++) { if ((1<<j)&i) cnts[i]++; } } for (zu=0;zu<t;zu++) { int n,m,k; scanf("%d%d%d",&n,&m,&k); for (i=1;i<=k;i++) { ans[i]=0; } for (i=0;i<n;i++) { scanf("%s",c[i]); } for (i=0;i<(1<<n);i++) { int sum=0; bool impo=false; for (j=0;j<m;j++) { must_update[j]=false; int k; empty[j]=true; for (k=0;k<n;k++) { if ((1<<k)&i) { if (c[k][j]=='Q') { empty[j]=false; } continue; } if (c[k][j]=='Q') { must_update[j]=true; } } if (must_update[j]) { sum++; if (empty[j]) { impo=true; } } } if (impo) continue; if (sum>cnts[i]) continue; for (j=0;j<=m;j++) { int k; for (k=i;;k=(k-1)&i) { dp[j][k]=0; if (k==0) break; } } dp[0][i]=1; for (j=0;j<m;j++) { if (!must_update[j]) { int k; for (k=i;;k=(k-1)&i) { dp[j+1][k]+=dp[j][k]; if (k==0) break; } } if (empty[j]) { continue; } int k; for (k=i;;k=(k-1)&i) { int l=k; for (;l!=0;) { int p=l&(-l); l^=p; if (c[down_val[p]][j]=='Q') { dp[j+1][k^p]+=dp[j][k]; } } if (k==0) break; } } ans[cnts[i]]+=dp[m][0]; } long long val=1; for (i=1;i<=k;i++) { val*=i; (bigint(ans[i])*bigint(val)).output(); } } return 0; }