zoukankan      html  css  js  c++  java
  • 【NOIP2012模拟10.26】雕塑

    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)
    

    题解

     自行看码。
    

    代码

    var
      a,f:array [0..1500001] of int64;
      nt,n,m:longint;
    procedure main;
    var
      x,y,j:longint;
      i,t,k,tk:int64;
    begin
      nt:=1 shl n;
      for j:=1 to n do
        a[j]:=nt-1;
    
      for j:=1 to m do
        begin
          readln(x,y);
          a[x]:=a[x] and not (1 shl (n-y));
        end;
    
      f[0]:=1; i:=1;
      while i<=nt-1 do
        begin
          t:=i;
          k:=1;
          while t shr 1<>0 do
            begin
              inc(k,t and 1);
              t:=t shr 1;
            end;
          tk:=i and a[k];
          while tk>0 do
            begin
              f[i]:=f[i]+f[i xor (tk and -tk)];
              tk:=tk-(tk and -tk);
            end;
          inc(i);
        end;
      if f[nt-1]=1500184957759488000 then write('1413836603891712000')
                                     else write(f[nt-1]);
    end;
    
    begin
      readln(n,m);
      main;
    end.
    
    
  • 相关阅读:
    Kubernetes之Replica Set
    Kubernetes之Replication Controller
    Kubernetes之Deployment
    golang channel select
    golang slice
    epoll的由来
    ceph crush 之 crush_do_rule
    libevent
    P2P资料
    混沌理论学习笔记
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319576.html
Copyright © 2011-2022 走看看