1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 #define debug(x) cout<<#x<<" = "<<x<<endl; 6 const int maxn=1207; 7 ll n,kk,s_num; 8 ll ans=0,f[20][207][117]; 9 ll s[maxn],cnt[maxn]; 10 void prepare(){ 11 ll i,j,k; 12 for(i=0;i<(1<<n);i++){ 13 k=0; 14 if(i&(i<<1)) continue; 15 for(j=0;j<n;j++){ 16 if(i&(1<<j)) k++; 17 } 18 s[++s_num]=i; 19 cnt[s_num]=k; 20 } 21 } 22 void process(){ 23 f[0][1][0]=1; 24 for(int i=1;i<=n;i++){ 25 for(int j=1;j<=s_num;j++){ 26 for(int nu=0;nu<=kk;nu++){ 27 if(nu<cnt[j]) continue; 28 for(int k=1;k<=s_num;k++){ 29 if((s[j]&s[k])||(s[j]&(s[k]<<1))||(s[j]&(s[k]>>1))) continue; 30 f[i][j][nu]+=f[i-1][k][nu-cnt[j]]; 31 } 32 } 33 } 34 } 35 for(int i=1;i<=s_num;i++) ans+=f[n][i][kk]; 36 } 37 int main(){ 38 cin>>n>>kk; 39 prepare(); 40 process(); 41 cout<<ans<<endl; 42 return 0; 43 }
这样差不多的题目还有牧场的安排,炮兵阵地啥的......