题目

作为NOIP2018的题目,我觉得不需要把题目贴出来了。

大意就是,在一个n∗mn*mn∗m的010101矩阵中,从左上角到右下角的路径中,对于任意的两条,上面的那条小于下面的那条。问满足这样的矩阵的个数。

好吧,有点简陋……


比赛思路

一眼看下去,诶,nnn这么小,一下子就想到了状压DP。

然后有一点很显然:(i,j)≤(i+1,j−1)(i,j)\leq (i+1,j-1)(i,j)≤(i+1,j−1)。

依照这个性质,我打出了一个状压DP。

然后发现,第二个样例崩了。

然后手算了半天,推出来另一个朦胧的性质……

然后看看时间,啊,不能再推式子了!没时间啦!

匆匆打个暴力,去思考第三题。


正解

这题的正解有很多种。

的确有状压DP,不过最优的方法还是lyl推了两节数学课的神方法。

用这个方法,就算开到long long范围,也可以秒过。

其实这题还有一个性质:

如果(i,j)=(i+1,j−1)(i,j)=(i+1,j-1)(i,j)=(i+1,j−1),那么以(i+1,j)(i+1,j)(i+1,j)为左上角的矩形的所有对角线上的数字相等。

至于为什么,也是比较好理解的。

如果有条到(i,j−1)(i,j-1)(i,j−1)的路径,可以分成两条分别走到(i,j)(i,j)(i,j)和(i+1,j−1)(i+1,j-1)(i+1,j−1),再走到(i+1,j)(i+1,j)(i+1,j),在这个时候它们是相等的。如果这个矩形中有不相等的路径,那么必定存在一种方案使通过(i,j)(i,j)(i,j)的走小的,通过(i+1,j−1)(i+1,j-1)(i+1,j−1)的走大的,不符合条件。所以在这个矩形中的左上角到右下角的路径相等,要让路径相等,对角线就要相等。

有了这个条件,这道题就变得复杂起来。lyl大佬发挥出他超强的推式子能力,把这题A穿了。

首先,我们可以分类讨论。

先讨论n=mn=mn=m的情况

  1. 当(0,1)=(1,0)(0,1)=(1,0)(0,1)=(1,0)时

    在这个情况比较简单,答案为2∗2∗4n−2∗2n−12*2*4^{n-2}*2^{n-1}%2∗2∗4n−2∗2n−1
  2. 当(0,1)≠(1,0)(0,1)\neq (1,0)(0,1)̸​=(1,0)时
    1. 当(0,2)=(1,1)=(2,0)(0,2)=(1,1)=(2,0)(0,2)=(1,1)=(2,0)时

      也比较简单,2∗2∗5∗4n−4∗2n−12*2*5*4^{n-4}*2^{n-1}2∗2∗5∗4n−4∗2n−1

    2. 当(1,1)=(2,0)(1,1)=(2,0)(1,1)=(2,0)时



      黄色表示这片区域内的对角线相等。

      设fif_ifi​表示到iii这条对角线,i−1i-1i−1或之前对角线的上面两个一样的方案数。

      (这里的对角线为(0,3)(0,3)(0,3)到(0,n−1)(0,n-1)(0,n−1)为右上角的两个对角线,编号从111开始)

      那么fi=fi−1∗4+4∗5f_i=f_{i-1}*4+4*5fi​=fi−1​∗4+4∗5

      fi−1∗4f_{i-1}*4fi−1​∗4表示i−2i-2i−2或之前已经有了对角线上面两个一样的,那么第iii条对角线被限制了,所以只有444种。

      4∗54*54∗5表示i−1i-1i−1有上面两个一样,那么第iii条不受限制,有555种。

      接下来我们计算这种情况的方案数:

      2∗(3+4∗3+fn−3∗2)∗2n−22*(3+4*3+f_{n-3}*2)*2^{n-2}2∗(3+4∗3+fn−3​∗2)∗2n−2

      估计问题在(3+4∗3+fn−3∗2)(3+4*3+f_{n-3}*2)(3+4∗3+fn−3​∗2)这里面。

      333表示以(0,n−1)(0,n-1)(0,n−1)为右上角的对角线的上面两个不一样,之前的也不一样,那么以(1,n−1)(1,n-1)(1,n−1)为右上角的对角线不受影响,方案为333

      4∗34*34∗3表示以(0,n−1)(0,n-1)(0,n−1)为右上角的对角线的上面两个一样,之前的不一样,那么以(1,n−1)(1,n-1)(1,n−1)为右上角的对角线还是不受影响,方案为4∗34*34∗3

      fn−3∗2f_{n-3}*2fn−3​∗2表示以(0,n−2)(0,n-2)(0,n−2)或之前有对角线上面两个一样的,那么以(1,n−1)(1,n-1)(1,n−1)为右上角的对角线受到限制,方案为fn−3∗2f_{n-3}*2fn−3​∗2

    3. 当(0,2)=(1,1)(0,2)=(1,1)(0,2)=(1,1)时

      可以发现和上面的情况对称,所以也是2∗(3+4∗3+fn−3∗2)∗2n−22*(3+4*3+f_{n-3}*2)*2^{n-2}2∗(3+4∗3+fn−3​∗2)∗2n−2


这样n=mn=mn=m的情况就考虑完了。

接下来考虑n+1=mn+1=mn+1=m的情况。

  1. 当(0,1)=(1,0)(0,1)=(1,0)(0,1)=(1,0)时



    我们可以将深黄色的这一部分向右平移



    然后你就可以发现多出来的实际上是中间绿色的这一部分。

    显然这一部分的方案数为333,所以答案∗3*3∗3
  2. 当(0,1)≠(1,0)(0,1)\neq (1,0)(0,1)̸​=(1,0)时
    1. 当(0,2)=(1,1)=(2,0)(0,2)=(1,1)=(2,0)(0,2)=(1,1)=(2,0)时,和上面的差不多,也是∗3*3∗3。
    2. 当(1,1)=(2,0)(1,1)=(2,0)(1,1)=(2,0)时

      答案为2∗(3+3∗3+(4∗4+fn−3∗3)∗2)∗2n−22*(3+3*3+(4*4+f_{n-3}*3)*2)*2^{n-2}2∗(3+3∗3+(4∗4+fn−3​∗3)∗2)∗2n−2

      分类讨论:

      1. (0,n)(0,n)(0,n)为右上角的对角线的上面两个不一样,之前的也不一样。
      2. (0,n)(0,n)(0,n)为右上角的对角线的上面两个一样,之前的不一样。
      3. (0,n−1)(0,n-1)(0,n−1)或之前为右上角的对角线的上面有两个一样的。
    3. 当(0,2)=(1,1)(0,2)=(1,1)(0,2)=(1,1)时
    4. 答案为2∗(4+4∗4+fn−3∗3)∗2n−1)2*(4+4*4+f_{n-3}*3)*2^{n-1})2∗(4+4∗4+fn−3​∗3)∗2n−1)

      类似类似(比上一种简单)

在推完这些东西之后,我们就可以发现,在m=n+1m=n+1m=n+1之后,mmm每+1+1+1,答案∗3*3∗3

证明?

分各种情况讨论,是可以证出来的……

要了我好久的时间……

懒得打上来了,留给自已以后温故的时候思考。

反正,最终的时间复杂度是O(lg⁡n+lg⁡m)O(\lg n+\lg m)O(lgn+lgm)(求fff的时候其实可以用矩阵来求)的,非常优秀。

所以lyl说这题的数据太小了,我看可以大一些,大到什么程度呢?

给你读入两个位数十万的二进制数,分别表示nnn、mmm。


代码

  1. using namespace std;
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define mo 1000000007
  6. inline long long my_pow(long long x,int y){
  7. long long res=1;
  8. for (;y;x=x*x%mo,y>>=1)
  9. if (y&1)
  10. res=res*x%mo;
  11. return res;
  12. }
  13. #define N 8
  14. int n,m;
  15. long long f[N+1];
  16. int main(){
  17. freopen("game.in","r",stdin);
  18. freopen("game.out","w",stdout);
  19. scanf("%d%d",&n,&m);
  20. if (n>m)
  21. swap(n,m);
  22. if (n==1)
  23. printf("%lld\n",my_pow(2,m));
  24. else if (n==2)
  25. printf("%lld\n",12*my_pow(3,m-2)%mo);
  26. else if (n==3)
  27. printf("%lld\n",112*my_pow(3,m-3)%mo);
  28. else{
  29. long long a1=2*2*my_pow(4,n-2)*my_pow(2,n-1)%mo;/*(0,1)(1,0)相同时*/
  30. long long a2=2*2*5*my_pow(4,n-4)%mo*my_pow(2,n-1)%mo;/*(0,2)(1,1)(2,0)相同时*/
  31. for (int i=2;i<=n-3;++i)
  32. f[i]=f[i-1]*4/*之前有过,所以这一位受到了限制*/+4*5/*i-1相同*/;
  33. if (n==m){
  34. long long ans=2*2*(3/*上面的n-3个对角线全部不一样*/+4*3/*第n-3个对角线一样*/+f[n-3]*2/*n-3之前的有过一样*/)%mo*my_pow(2,n-2)%mo;//(0,2)(1,1)(2,0)其中有两个相同时
  35. printf("%lld\n",(a1+a2+ans)%mo);
  36. }
  37. else{
  38. long long ANS1=2*(3/*(1,n)之前没有一样*/+3*3/*(0,n)和(1,n-1)一样*/+(4*4/*(0,n-1)和(1,n-2)一样*/+f[n-3]*3)*2)%mo*my_pow(2,n-2)%mo;
  39. long long ANS2=2*(4+4*4+f[n-3]*3)%mo*my_pow(2,n-1);
  40. printf("%lld\n",((a1+a2)*3+ANS1+ANS2)*my_pow(3,m-n-1)%mo);
  41. }
  42. }
  43. return 0;
  44. }

在此再%一下lyl大爷,两节数学课顶的过我们的几天。

JZOJ5965【NOIP2018提高组D2T2】填数游戏的更多相关文章

  1. @NOIP2018 - D2T2@ 填数游戏

    目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 ...

  2. [NOIP2018 TG D2T2]填数游戏

    题目大意:$NOIP2018\;TG\;D2T2$ 题解:在skip2004的博客基础上修改的,也是暴搜. 说明一下把vector改成数组并不可以通过此题,记录. 结论:在$m>n+1$时答案为 ...

  3. [NOIp2007提高组]矩阵取数游戏

    OJ题号:洛谷1005 思路: 动态规划. 不难发现每行能够取得的最大值仅与当前行的数据有关,因此本题可以对每行的数据分别DP,最后求和. 设$f_{i,j}$表示左边取$i$个.右边取$j$个的最大 ...

  4. NOIP2018提高组题解

    D1T1:铺设道路 回忆NOIP2013D2T1 积木大赛,发现这两题唯一的区别就是一个是造山一个是填坑,而把填坑的操作反序就是造山,所以可以直接使用那道题的方法. 具体方法是,从左到右每次考虑新的一 ...

  5. NOIP2018提高组金牌训练营——动态规划专题

    NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...

  6. [NOIp2018提高组]货币系统

    [NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...

  7. NOIP2018提高组Day2 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). \(Day2\)的题目和\(Day1\)比起来,真的是难了很多啊. \(T1\):旅行(点此看 ...

  8. NOIP2018提高组省一冲奖班模测训练(六)

    NOIP2018提高组省一冲奖班模测训练(六) https://www.51nod.com/Contest/ContestDescription.html#!#contestId=80 20分钟AC掉 ...

  9. NOIP2018提高组省一冲奖班模测训练(四)

    NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...

随机推荐

  1. Postgraduate

    https://account.chsi.com.cn/passport/login?entrytype=yzgr&service=https%3A%2F%2Fyz.chsi.com.cn%2 ...

  2. 关于SecureCRT不能显示输入、换行不正常

    网上绿色破解版的SecureCRT会碰到这种问题,即输入字符不显示在终端.换行后下一行的行首有很大一段退格: 如上,输入的指令不显示:回车后下一行的起始位置不对. 碰到这种问题,在波特率.奇偶校验.停 ...

  3. 阿里云 Aliplayer高级功能介绍(三):多字幕

    基本介绍 国际化场景下面,播放器支持多字幕,可以有效解决视频的传播障碍难题,该功能适用于视频内容在全球范围内推广,阿里云的媒体处理服务提供接口可以生成多字幕,现在先看一下具体的效果: WebVTT格式 ...

  4. 强连通图缩点——cf999E

    问题转换成缩点求度数为0的点的个数,s点所在联通块作额外处理 缩点写的很烂调了一早上.. #include<bits/stdc++.h> #include<vector> us ...

  5. ECMAScript 6中的Set和Map数据结构

    一.Set 基本用法: Set本身是一个构造函数,用来生成Set数据结构.Set函数可以接受一个数组作为参数用来初始化. const arr = new Set([2,2,3,3,4,4,5,8]); ...

  6. 求教各路大神,Fillder的证书一直无法在手机上打开,请教怎么解决

    我跟足大神们的设置,软件是Fiddler4,手机是ios12.3.1. FD上该打勾的打勾了,该装证书的也装了,有帖子说重装证书和软件我也都试过,电脑也下了NET Framework 4.7_4.7. ...

  7. 二分图最佳匹配KM算法 /// 牛客暑期第五场E

    题目大意: 给定n,有n间宿舍 每间4人 接下来n行 是第一年学校规定的宿舍安排 接下来n行 是第二年学生的宿舍安排意愿 求满足学生意愿的最少交换次数 input 2 1 2 3 4 5 6 7 8 ...

  8. sql 字符串连接

    const string FMCG_BASH = "清除重复商品"; var sqls = new List<string>(); //// Fmcg sqls.},R ...

  9. Eclipse 连接MySql数据库总结

    Eclipse 连接MySql数据库总结 一.在MySql中创建数据库,并创建表,向表中插入数据 1.创建数据库 create database select_test 2.创建表 create ta ...

  10. 在 my_rootfs 中建立 Linux 目录树

    [arm@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr [arm@localhost m ...