[BZOJ 4563][Haoi2016]放棋子(错排公式)

Description

给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行只有一枚棋子,每列只有一枚棋子的限制,求有多少种方案。

Solution

其实和给出的障碍没什么关系,可以直接上错排公式(因为一开始的障碍可以看做一个排列,然后放棋子等同于要你生成一个新的不能有和原来位置相同元素的排列)

f[n]=(f[n-1]+f[n-2])*(n-1)(为什么的话上一篇里有说QwQ)

要加高精!

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n;
struct Bign
{
    static const int base=1000000;
    int len,s[1000];
    Bign(){len=1;memset(s,0,sizeof(s));}
    Bign(int num){*this=num;}
    Bign operator = (int num)
    {
        len=0;
        while(num)
        {
            s[len++]=num%base;
            num/=base;
        }
        return *this;
    }
    Bign operator + (const Bign& b)
    {
        Bign c;c.len=0;
        for(int i=0,g=0;g||i<max(len,b.len);i++)
        {
            g+=s[i]+b.s[i];
            c.s[c.len++]=g%base;
            g/=base;
        }
        return c;
    }
    Bign operator * (const int& b)
    {
        Bign c;c.len=0;
        for(int i=0;i<len||c.s[c.len];i++)
        {
            c.s[i]+=s[i]*b;
            c.s[i+1]+=c.s[i]/base;
            c.s[i]%=base;
            ++c.len;
        }
        return c;
    }
    void print()
    {
        printf("%d",s[len-1]);
        for(int i=len-2;i>=0;i--)
        printf("%06d",s[i]);
    }
}F[2];
int main()
{
    scanf("%d",&n);
    F[0]=1,F[1]=0;
    for(int i=2;i<=n;i++)
    {
        F[0]=(F[0]+F[1])*(i-1);
        swap(F[0],F[1]);
    }
    F[1].print();
    return 0;
}
时间: 2024-10-27 07:35:48

[BZOJ 4563][Haoi2016]放棋子(错排公式)的相关文章

JZYZOJ1544 [haoi2016T2]放棋子 错排公式 组合数学 高精度

http://172.20.6.3/Problem_Show.asp?ID=1544&a=ProbNF 看了题解才意识到原题有错排的性质(开始根本不知道错排是什么). 十本不同的书放在书架上.现重新摆放,使每本书都不在原来放的位置.有几种摆法?这个问题的解答就是10个元素的错排数. 错排定义:考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排. 错排数的递推式当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数(错排数)用D

bzoj4563[Haoi2016]放棋子

bzoj4563[Haoi2016]放棋子 题意: 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列.要求你放N枚棋子(障碍的位置不能放棋子),也满足每行只有一枚棋子,每列只有一枚棋子的限制,求有多少种方案.N≤200. 题解: 发现在障碍在什么位置和答案无关.因此可以把棋子摆成左上-右下对角线,然后就是错排问题(一个长度为n的排列,要求每个元素不能放在与自己编号相同的位置上,问有多少种方案满足条件)了.错排公式:f[i]=(f[i-1]+f[i-2]

杭电 1465 不容易系列之一(错排公式)

http://acm.hdu.edu.cn/showproblem.php?pid=1465 不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14236    Accepted Submission(s): 5917 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了

错排公式

1 递推的方法推导错排公式 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法: 第二步,放编号为k的元素,这时有两种情况⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有M(n-2)种方法:⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法

错排公式 错排(加组合)

递推的方法推导错排公式 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法; 第二步,放编号为k的元素,这时有两种情况.1,把它放到位置n,那么,对于剩下的n-2个元素,就有M(n-2)种方法;2,不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法; 综上得到 M(n)=(n-1)[M(n-2)+M

HDU 2068 RPG的错排(错排公式 + 具体解释)

RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8996    Accepted Submission(s): 3699 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,当中有一队叫RPG,但做为集训队成员之中的一个的野骆驼居然不知道RPG三个人详细是谁谁.RPG给他机会让他猜猜,第一次猜

HDU 2068 RPG错排 错排公式

1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: 3.分析:原题意换句话说,就是针对1到N的全排列,错排元素的个数小于等于N的情况有多少: 那么,输出即为:    ,其中F[i]表示1到i的错排方案数,后面一项为组合数,即选取i个错排: 这里推导一下错排公式,F[N]表示1到N的错排方案:第一步:选取N放到1到N-1之中任意一个位置,这样就有N-1

不容易系列之一(错排公式+容斥)

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17475    Accepted Submission(s): 7284 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容

hdu 4535(排列组合之错排公式)

吉哥系列故事——礼尚往来 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1417    Accepted Submission(s): 733 Problem Description 吉哥还是那个吉哥 那个江湖人称“叽叽哥”的基哥 每当节日来临,女友众多的叽叽哥总是能从全国各地的女友那里收到各种礼物. 有礼物收到当然值得高兴,但回礼确是