传送门

Description

求给\(n*m\)的矩阵填数的方案数

满足:

\[1\leq x_{i,j}\leq m
\]

\[x_{i,j}<x_{i,j+1}
\]

\[x_{i,j}<x_{i-1,j+1}
\]

Solution 

\(f[i][j]\)表示当前第\(i\)行少的数字是\(j\)的方案数

\[f[i][j]=\sum_{k=1}^{j+1}f[i-1][k]=f[i][j-1]+f[i-1][j+1]
\]

观察dp的转移方程

发现它和路径计数的过程很类似

通过等价变化,答案即为:

从\((0,0)\)到\((n+m+1,n)\)且不经过直线,\(A:y=x+1\),\(B:y=x-(m+2)\)的方案数

走的方式为只能沿坐标轴的正方向

假如说如果没有限制条件,从\((0,0)\) 到\((x,y)\) 的方案数是\(\binom{x+y}{x}\)

接下来,我们考虑如何进行容斥:

考虑一种关于自身长度奇偶性的容斥

简化一下不合法的经过的路线,有两种情况:\(ABABAB...\)和\(BABABA...\)

这里,如若连着触碰一个条线,我们把它当作是一次

设终点为\((x,y)\),它关于\(A\)的对称点是\((x_1,y_1)\)

那么从\((0,0)\)到\((x_1,y_1)\)的路径可以对应一条必然经过了一次\(A\)线的路径,所以它的结尾肯定是\(AB\)或\(A\)

将其减去

设\((x_1,y_1)\)关于\(B\)的对称点是\((x2_y2)\)

那么从\((0,0)\)到\((x2,y2)\)的路径可以对应一条必然经过了一次\(BA\)的路径,所以它的结尾肯定是\(BA\)或\(BAB\)

将其加回

......

如此往复,直到不存在所要求的路径的后缀

可以发现,这样一来,恰好所有以\(A\)开头的都被计算了奇数次,也就是被减了一次

以\(B\)开头的不合法路径相似计算即可

Code 

  1. //f[i][j]表示当前第i行少的数字是j的方案数
  2. //f[i][j]=\sum_{k=1}^{j+1}f[i-1][k]=f[i][j-1]+f[i-1][j+1]
  3. //把改问题转换为路径问题,用组合数加容斥来做
  4. #include<bits/stdc++.h>
  5. #define reg register
  6. #define ll long long
  7. #define db double
  8. using namespace std;
  9. inline int read()
  10. {
  11. int x=0,f=1;char ch=getchar();
  12. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  13. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  14. return x*f;
  15. }
  16. const int MN=1e6+5,P=1e9+7;
  17. int n,m,M;
  18. int fac[MN<<2],inv[MN<<2];
  19. int Mul(int x,int y){return (1ll*x*y)%P;}
  20. int Add(int x,int y){y=((y%P)+P)%P;return (x+y)%P;}
  21. int X,Y,_,ans;
  22. int C(int x=M,int y=Y)
  23. {
  24. if(x<0||y<0||y>x)return 0;
  25. return Mul(Mul(fac[x],inv[y]),inv[x-y]);
  26. }
  27. void _1(){X=Y-1;Y=_+1;_=X;}
  28. void _2(){X=Y+(m+2);Y=_-(m+2);_=X;}
  29. int main()
  30. {
  31. n=read();m=read();M=2*n+m+1;
  32. _=X=n+m+1;Y=n;
  33. fac[0]=fac[1]=inv[0]=inv[1]=1;
  34. register int i,tmp;
  35. for(i=2;i<=M;++i) fac[i]=Mul(fac[i-1],i);
  36. for(i=2;i<=M;++i) inv[i]=Mul(inv[P%i],(P-P/i));
  37. for(i=2;i<=M;++i) inv[i]=Mul(inv[i-1],inv[i]);
  38. ans=C();
  39. for(i=1;;++i)
  40. {
  41. if(i&1) _1();else _2();if(X<0||Y<0) break;
  42. ans=Add(ans,(-1)*(i&1?1:-1)*C());
  43. }
  44. _=X=n+m+1;Y=n;
  45. for(i=1;;++i)
  46. {
  47. if(i&1) _2();else _1();if(X<0||Y<0) break;
  48. ans=Add(ans,(-1)*(i&1?1:-1)*C());
  49. }
  50. return 0*printf("%d\n",ans);
  51. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[JLOI 2015]骗我呢的更多相关文章

  1. BZOJ 4005 [JLOI 2015] 骗我呢

    首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[0, m]$ 的数没有出现. 我们可以考虑设 $Dp[i][j]$ 为处理完倒数 $i$ 行,倒数第 $i$ 行缺的数字 ...

  2. [JLOI2015]骗我呢

    [JLOI2015]骗我呢 Tags:题解 作业部落 评论地址 TAG:数学,DP 题意 骗你呢 求满足以下条件的\(n*m\)的矩阵的个数对\(10^9+7\)取模 对于矩阵中的第\(i\)行第\( ...

  3. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  4. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  5. 【BZOJ4005】[JLOI2015]骗我呢

    题意: Alice和Bob在经过了数学的洗礼之后,不再喜欢玩对抗游戏了,他们喜欢玩合作游戏.现在他们有一个n×m的网格,Alice和Bob要在一定规则下往网 格里填数字,Alice和Bob都是聪明绝顶 ...

  6. BZOJ 4004 [JLOI 2015] 装备购买 解题报告

    哎这个题 WA 了无数遍...果然人太弱... 首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备. 至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会.TATQAQ ...

  7. bzoj4005[JLOI2015]骗我呢

    http://www.lydsy.com/JudgeOnline/problem.php?id=4005 神题~远距离orz 膜拜PoPoQQQ大神 #include<cstdio> #i ...

  8. [JLOI 2015]装备购买

    Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示  (1 <= i <= n; 1 < ...

  9. [JLOI 2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...

随机推荐

  1. jquery.pagination.js分页demo

    公用jquery.pagination.js /** * This jQuery plugin displays pagination links inside the selected elemen ...

  2. The underlying connection was closed: An unexpected error occurred on a rece

    服务器问题,在后台访问外网了,特别是https的网站,容易出这个问题. 修改服务器配置,或修改代码解决.

  3. Fiddler-在fiddlerscript中修改某个请求的请求头内容

    1.进入  OnBeforeRequest函数 在里面添加如下代码 if(oSession.fullUrl.Contains("url")){// //headers中添加测试参数 ...

  4. mysql-多表联查(实例)

    目录 多表查询 笛卡尔积查询 内连接查询 左外连接查询 右外连接查询 全外连接查询 多表查询 笛卡尔积查询 笛卡尔积查询:就是两张表相乘,若左边表有M条信息,右边表有N条信息,那么查询显示的信息总共为 ...

  5. 练习bloc , 动画

    有点意思, import 'package:flutter/material.dart'; import 'package:rxdart/rxdart.dart'; main()=>runApp ...

  6. 原油petrolaeum石油 Archaic spelling of petroleum

    petrolaeum (uncountable) Archaic spelling of petroleum petroleum See also: Petroleum Contents [hide] ...

  7. 【RAC】将RAC备份集恢复为单实例数据库

    [RAC]将RAC备份集恢复为单实例数据库 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ...

  8. json模块中dumps()与dump()区别

    dumps是将dict转化成json字符串格式,loads是将json字符串转化成dict格式. dump和load也是类似的功能,只是与文件操作结合起来了. dump(写入内容,文件对象) 和loa ...

  9. iframe页面script交互

    主页面: <html> <tr> <td> <div id=RightViewDiv> <iframe name=SubSeekFrame sty ...

  10. mysql表的创建、查看、修改、删除

    一.创建表 创建表前先使用use 数据库名进入某一个数据库,创建表语句的格式如下: create table 表名称 ( 列名1 列的数据类型 [约束], 列名2 列的数据类型 [约束], 列名2 列 ...