16.9.10 C:3059. 【NOIP2012模拟10.26】雕塑

1 篇文章 0 订阅
1 篇文章 0 订阅

Description

【问题描述】

Wcyz为了迎接百年校庆,美化校园,请了校友笨笨将n座雕塑,准备安置在校园内,整个校园可以抽象成一个n*n的大网格,每个1*1网格最多只能安置一座雕塑,但是某些1*1的网格上恰好是一个食堂或湖泊,这些网格是不能安置雕塑的,每个雕塑的造型相同,这样同一种安置方案中交换排列都算一种。任意雕塑在同一行或同一列是不合法的方案。

学校想知道有多少种安置方案,笨笨想从中选择最好的一种方案,笨笨想请你告诉他方

案种数。

Input

【输入格式】

第一行,两个整数n,m(n<=20,m<=10),用空格隔开,n表示n*n的大网格,m表示不能安置雕塑的位置


第二行至m+1行,每行两个数x,y,用空格分开,表示坐标(x,y)的1*1 的网格上不能安置雕塑。

Output

【输出格式】

一个数,方案种数(方案种数<=2^63-1)

Sample Input

6 7

1 1

2 1

2 2

3 3

3 4

4 3

4 4

Sample Output

184

Data Constraint

Hint

n<=20,m<=10

思路:用x[i] 和 y[j] 表示坐标(x,y)能否放置,然后用rk表示把k个雕塑放在了n*n的方格上,并且这k个雕塑都处在禁区放置位置上的方案数,再然后要用到容斥原理求出n个雕塑放在非禁区的数量为:
n!-r1*(n-1)!+r2*(n-2)-r3*(n-3)!…(-1)^k*rk*(n-k)!…+(-1)^n*rn。
代码如下,仅供参考,切勿抄袭(这次数学题好多啊!回去要恶补了!):

#include<cstdio>  
#include<cstring>
#define F(i,x,y) for(int i=x;i<=y;i++)
using namespace std;  
const int maxn = 25;
int n,m,r[maxn]//第i个雕塑在禁区放置位置上的方案数,a[maxn][3]//横坐标和纵坐标;  
bool x[maxn],y[maxn];//安置雕塑
long long d[50]//阶乘,ans;  
void dfs(int o,int t,int tt)
{  
    if (!t) 
    {  
        r[tt]++; return;  走完说明方案数又多一个。
    }  
    F(i,o+1,m)
    {
      if (!x[a[i][1]] && !y[a[i][2]]) //有没有被放过
      {  
        x[a[i][1]]=true; 
        y[a[i][2]]=true;  
        dfs(i,t-1,tt);  
        x[a[i][1]]=false; 
        y[a[i][2]]=false;  
      }  
   }
}  
int main()
{  
    freopen("3.in","r",stdin);  

    scanf("%d%d",&n,&m);  

    F(i,1,m) scanf("%d%d",&a[i][1],&a[i][2]); 

    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y)); 

    F(i,1,m) dfs(1,i,i);

    d[0]=1; 

    F(i,1,n) d[i] = d[i-1] * i;


    ans=d[n];//式子的第一项

    F(i,1,m)
      if(i%2==1)         //判断式子的第i项为奇数项和偶数项,
        ans-=r[i]*d[n-i];
      else 
        ans+=r[i]*d[n-i];

    printf("%lld\n",ans);
    return 0;
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值