zoukankan      html  css  js  c++  java
  • [HAOI2016]放棋子

    [HAOI2016]放棋子

    有一(N imes N)的棋盘,有N个障碍物放入其中,已经给出其位置,并且保证每一行每一列有且仅有一个障碍物,现在再给你N个棋子,放入其中,保证每一行每一列有且仅有一颗棋子,询问其方案数。

    根据错排自由定理,我们完全可以把障碍物按照行递增的方式的排序起来,即把障碍物全部摆到对角线上特殊化问题,于是对于每一列摆棋子即变成不能摆对应列号的行,转换模型即一个1~N全排列中,保证每个数都不摆到其对应编号的位置上,此时就变成了一个裸的错排模型,设(f[n])表示长n的错排问题的方案数,与(f[n-1])关系在于多了一个数n放入其中,它显然不能放到第n个位置,于是放在前面有n-1种选择,而被放的位置的数可以选择放到第n个位置,这样就变成(f[n-2])的错排问题,而如果不放到最后一个位置,不难得知等价于(f[n-1])的错排问题,于是我们有

    [f[n]=(n-1) imes(f[n-1]+f[n-2]) ]

    边界:(f[1]=0,f[2]=1)

    答案:(f[n])

    打个高精即可。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define il inline
    #define ri register
    using namespace std;
    struct lll{
        int num[1000];
        lll(){memset(num,0,sizeof(num)),num[0]|=true;}
        il void operator=(string s){
            num[0]=s.size();
            for(int i(1);i<=num[0];++i)
                num[i]=s[num[0]-i]-48;
        }
        il void print(){
            for(ri int i(num[0]);i;--i)
                putchar(num[i]+48);
        }
        il lll operator+(lll x){
            lll y;ri int i;
            for(i=1;i<=num[0]||i<=x.num[0];++i){
                y.num[i]+=num[i]+x.num[i];
                if(y.num[i]>9)y.num[i]-=10,++y.num[i+1];
            }while(!y.num[i]&&i)--i;y.num[0]=i;return y;
        }
        il lll operator*(lll x){
            lll y;ri int i,j,k;
            for(i=1;i<=num[0];++i){
                k=0;
                for(j=1;j<=x.num[0];++j)
                    y.num[i+j-1]+=k+num[i]*x.num[j],
                        k=y.num[i+j-1]/10,y.num[i+j-1]%=10;
                y.num[i+x.num[0]]+=k;
            }y.num[0]=num[0]+x.num[0];
            while(y.num[0]&&!y.num[y.num[0]])--y.num[0];
            return y;
        }
    }dp[201],lsy;
    int main(){
        int n,i;scanf("%d",&n);
        dp[2]="1",lsy="2";
        for(i=3;i<=n;++i,lsy=lsy+dp[2])
            dp[i]=(dp[i-1]+dp[i-2])*lsy;
        dp[n].print();
        return 0;
    }
    
    
  • 相关阅读:
    Hadoop集群时间同步
    Hadoop学习笔记
    分布式系统搭建
    ubuntu主机名修改
    自定义MapReduce中数据类型
    MapReduce执行流程及程序编写
    YARN框架详解
    Maven下从HDFS文件系统读取文件内容
    Maven搭建Hadoop开发环境
    hdfs文件系统架构详解
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/10801567.html
Copyright © 2011-2022 走看看