记录编号 240946 评测结果 AAAAAAAAAA
题目名称 雕塑安置 最终得分 100
用户昵称 GravatarZXCVBNM_1 是否通过 通过
代码语言 C++ 运行时间 0.017 s
提交时间 2016-03-24 09:37:17 内存使用 0.31 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL tot,n,r[36];
bool vis[36][36],h[36],l[36];
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<=min(m,n);i++)
    {
        if(i%2==0)ans+=r[i]*k;
        else ans-=r[i]*k;
        if(nn==0)break;
        k/=nn;nn--;
        //if(nn==0)break;
    }
    printf("%lld",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}