Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 389  Solved: 248
[Submit][Status][Discuss]

Description

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

Input

第一行一个N,接下来一个N*N的矩阵。N<=200,0表示没有障碍,1表示有障碍,输入格式参考样例
 

Output

一个整数,即合法的方案数。

Sample Input

2
0 1
1 0

Sample Output

1

HINT

 

Source

交换阵法的行列对于答案是没有影响的,所以我们可以将阴阳玉都
换到对角线上, 然后答案就变为了求 n 的错排数, 通过递推式即可求出。

f[n]=(n-1)*(f[n-1]+f[n-2]);

高精

考试丧心病狂的数据最大到5000 需要压位高精 代码底下有 。

屠龙宝刀点击就送

#include <cstring>
#include <cstdio>
#define N 500
#define MOD 10 inline int max(int a,int b) {return a>b?a:b;}
struct node
{
int a[N];
inline node operator+(node b)
{
node c;
c.a[]=max(a[],b.a[])+;
for(int i=;i<=c.a[];++i)
{
c.a[i]+=a[i]+b.a[i];
c.a[i+]+=c.a[i]/MOD;
c.a[i]=c.a[i]%MOD;
}
for(;c.a[]>&&c.a[c.a[]]==;c.a[]--);
return c;
}
node() {memset(a,,sizeof(a));}
}ans[N];
int G[N][N],n;
node operator*(int x,node b)
{
int t=;
node c;
c.a[]=b.a[]+;
for(int i=;i<=c.a[];++i) c.a[i]=b.a[i]*x;
for (int i=;i<=c.a[];i++)
{
c.a[i]+=t;
if (c.a[i]>=MOD){t=c.a[i]/MOD;c.a[i]%=MOD;}
else t=;
}
for(;t;t/=MOD) c.a[++c.a[]]=t%MOD;
for(;c.a[]>&&c.a[c.a[]]==;c.a[]--);
return c;
}
int Main()
{
scanf("%d",&n);
ans[].a[]=;ans[].a[]=,ans[].a[]=ans[].a[]=;
/* for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&G[i][j]);*/
for (int i=;i<=n;i++) ans[i]=(i-)*(ans[i-]+ans[i-]);
printf("%d",ans[n].a[ans[n].a[]]);
for (int i=ans[n].a[]-;i>=;i--) printf("%d",ans[n].a[i]);
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}
#include <cstring>
#include <cstdio>
#define N 5005
#define MOD 10000 inline int max(int a,int b) {return a>b?a:b;}
struct node
{
int a[N];
inline node operator+(node b)
{
node c;
c.a[]=max(a[],b.a[])+;
for(int i=;i<=c.a[];++i)
{
c.a[i]+=a[i]+b.a[i];
c.a[i+]+=c.a[i]/MOD;
c.a[i]=c.a[i]%MOD;
}
for(;c.a[]>&&c.a[c.a[]]==;c.a[]--);
return c;
}
node()
{memset(a,,sizeof(a));}
}ans[N];
int G[N][N],n;
node operator*(int x,node b)
{
int t=;
node c;
c.a[]=b.a[]+;
for(int i=;i<=c.a[];++i) c.a[i]=b.a[i]*x;
for (int i=;i<=c.a[];i++)
{
c.a[i]+=t;
if (c.a[i]>=MOD){t=c.a[i]/MOD;c.a[i]%=MOD;}
else t=;
}
for(;t;t/=MOD) c.a[++c.a[]]=t%MOD;
for(;c.a[]>&&c.a[c.a[]]==;c.a[]--);
return c;
}
int Main()
{
freopen("firstmeet.in","r",stdin);
freopen("firstmeet.out","w",stdout);
scanf("%d",&n);
ans[].a[]=;ans[].a[]=,ans[].a[]=ans[].a[]=;
/* for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&G[i][j]);
*/ for (int i=;i<=n;i++) ans[i]=(i-)*(ans[i-]+ans[i-]);
printf("%d",ans[n].a[ans[n].a[]]);
for (int i=ans[n].a[]-;i>=;i--) printf("%04d",ans[n].a[i]);
return ;
fclose(stdin);
fclose(stdout);
}
int sb=Main();
int main(int argc,char *argv[]){;}

丧心病狂的5000(压位)

BZOJ 4563: [Haoi2016]放棋子的更多相关文章

  1. BZOJ——T 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status][Discuss] Descriptio ...

  2. bzoj4563: [Haoi2016]放棋子(错排+高精)

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status] ...

  3. [Haoi2016]放棋子 题解

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 285[Submit][Status] ...

  4. 【BZOJ4563】[Haoi2016]放棋子 错排+高精度

    [BZOJ4563][Haoi2016]放棋子 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...

  5. 洛谷P3182 [HAOI2016]放棋子

    P3182 [HAOI2016]放棋子 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要 ...

  6. BZOJ4563:[HAOI2016]放棋子——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4563 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列 ...

  7. BZOJ4563: [Haoi2016]放棋子

    Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在 这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行 ...

  8. BZOJ 3294: [Cqoi2011]放棋子

    3294: [Cqoi2011]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 628  Solved: 238[Submit][Status] ...

  9. [HAOI2016] 放棋子及错排问题

    题目 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足 ...

随机推荐

  1. day1 java基础回顾-集合

    1.集合 1.1 集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快, 增删慢 由于是数组实现 ...

  2. linux c二级指针的内存分配和使用

    #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h> ...

  3. js用"."和"[]"获取属性的区别

    在JavaScript中通常使用”."运算符来存取对象的属性的值.或者使用[]作为一个关联数组来存取对象的属性. 对象的属性和方法统称为对象的成员. 访问对象的属性 在JavaScript中 ...

  4. HDU - 1176 免费馅饼 DP多种状态转移

    免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了 ...

  5. Linear Algebra - Determinant(几何意义)

    二阶行列式的几何意义 二阶行列式 \(D = \begin{vmatrix}a_1&a_2\\b_1&b_2\end{vmatrix} = a_1b_2 - a_2b_1\) 的几何意 ...

  6. IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

    1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...

  7. 洛谷P1582 倒水

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  8. C# 主要运算符中的成员访问(?.)

    在开发过程中,我遇到了一种null 条件成员访问的写法,开始不太理解,之后专门查了微软的官方文档,下面是具体内容:   三种成员访问的三种形式 (1)x.y:成员访问. (2)x?.y:null 条件 ...

  9. 用IDEA写出第一个java web

    今天学习到如何创建新的java web,笔者使用的是IDEA,以下有详细的参考链接,如下: 参考链接:https://blog.csdn.net/zhdkong/article/details/789 ...

  10. java 同时安装多版本问题(转)

    描述:刚到新公司,自己安装了jdk1.7和开发工具myeclipse10,但是由于公司项目的需要(具体原因不详细描述了),需要使用myeclipse6.5和jdk1.6.于是在切换jdk1.7和jdk ...