比赛 20160323 评测结果 WAEAAAAAAA
题目名称 雕塑安置 最终得分 80
用户昵称 ZXCVBNM_1 运行时间 0.159 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2016-03-23 20:46:16
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL tot,n,r[16];
bool vis[26][26],h[26],l[26];
void dfs(int x,int y,int gs)
{
    //bool hh,ll;
    if(y==n+1){x++;y=1;}
    if(x==n+1)
    {
        if(gs==0)tot++;
        return;
    }
    dfs(x,y+1,gs);
    if(vis[x][y]==true&&h[x]==false&&l[y]==false){h[x]=true;l[y]=true;dfs(x,y+1,gs-1);h[x]=false;l[y]=false;}
}
int main()
{
    freopen("arrange.in","r",stdin);
    freopen("arrange.out","w",stdout);
    LL m,k,i,x,y,ans,nn;
    scanf("%lld %lld",&n,&m);
    memset(vis,false,sizeof(vis));
    for(i=1;i<=m;i++){scanf("%lld %lld",&x,&y);vis[x][y]=true;}
    memset(h,false,sizeof(h));
    memset(l,false,sizeof(l));
    r[0]=1;
    for(i=1;i<=m;i++)
    {
        tot=0;
        dfs(1,1,i);
        r[i]=tot;
    }
    k=1;nn=n;
    for(i=1;i<=n;i++)k*=i;
    ans=0;
    for(i=0;i<=m;i++)
    {
        if(i%2==0)ans+=r[i]*k;
        else ans-=r[i]*k;
        k/=nn;nn--;
        if(nn==0)break;
    }
    printf("%lld",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}