【NOIP 2018 提高组】填数游戏
传送门
problem
小 D 特别喜欢玩游戏。这一天,他在玩一款填数游戏。
这个填数游戏的棋盘是一个 n×mn \times mn×m 的矩形表格。玩家需要在表格的每个格子中填入一个数字(数字 000 或者数字 111),填数时需要满足一些限制。
下面我们来具体描述这些限制。
为了方便描述,我们先给出一些定义:
我们用每个格子的行列坐标来表示一个格子,即(行坐标,列坐标)。(注意: 行列坐标均从 000 开始编号)
合法路径 PPP:一条路径是合法的当且仅当:
这条路径从矩形表格的左上角的格子 (0,0)(0,0)(0,0) 出发,到矩形的右下角格子 (n−1,m−1)(n - 1,m - 1)(n−1,m−1) 结束;
在这条路径中,每次只能从当前的格子移动到右边与它相邻的格子,或者从当前格子移动到下面与它相邻的格子。
例如:在下面这个矩形中,只有两条路径是合法的,它们分别是 P1P_1P1:(0,0)(0,0)(0,0) →→→ (0,1)(0,1)(0,1) →→→ (1,1)(1,1)(1,1) 和 P2P_2P2:(0,0)(0,0)(0,0) →→→ (1,0)(1,0)(1,0) →→→ (1,1)(1,1)(1,1)。
对于一条合法的路径 PPP,我们可以用一个字符串 w(P)w(P)w(P) 来表示,该字符串的长度为 n+m−2n + m - 2n+m−2,其中只包含字符 “R” 或者字符 “D”, 第 iii 个字符记录了路径 PPP 中第 iii 步的移动方法,“R” 表示移动到当前格子右边与它相邻的格子,“D” 表示移动到当前格子下面与它相邻的格子。例如,上图中对于路径 P1P_1P1,有 w(P1)w(P_1)w(P1) === “RD”;而对于另一条路径 P2P_2P2, 有 w(P2)=w(P_2) =w(P2)= “DR”。
同时,将每条合法路径 PPP 经过的每个格子上填入的数字依次连接后,会得到一个长度为 n+m−1n + m - 1n+m−1 的 010101 字符串,记为 s(P)s(P)s(P)。例如,如果我们在格子 (0,0)(0,0)(0,0) 和 (1,0)(1,0)(1,0) 上填入数字 000,在格子 (0,1)(0,1)(0,1) 和 (1,1)(1,1)(1,1) 上填入数字 111(见上图红色数字)。那么对于路径 P1P_1P1,我们可以得到 s(P1)=s(P_1) =s(P1)= “011011011”,对于路径 P2P_2P2,有 s(P2)=s(P_2) =s(P2)= “001001001”。
游戏要求小 D 找到一种填数字 000、111 的方法,使得对于两条路径 P1P_1P1,P2P_2P2,如果 w(P1)>w(P2)w(P_1) > w(P_2)w(P1)>w(P2),那么必须 s(P1)≤s(P2)s(P_1) ≤ s(P_2)s(P1)≤s(P2)。我们说字符串 aaa 比字符串 bbb 小,当且仅当字符串 aaa 的字典序小于字符串 bbb 的字典序。但是仅仅是找一种方法无法满足小 D 的好奇心,小 D 更想知道这个游戏有多少种玩法,也就是说,有多少种填数字的方法满足游戏的要求?
小 D 能力有限,希望你帮助他解决这个问题,即有多少种填 000、111 的方法能满足题目要求。由于答案可能很大,你需要输出答案对 109+710^9 + 7109+7 取模的结果。
数据范围:n≤8n\le 8n≤8,m≤106m\le 10^6m≤106。
solution
这算是一道打表找规律的题,考场上写了个 dfsdfsdfs 套 dfsdfsdfs 找了 n≤3n\le 3n≤3 的规律。
具体的推导过程我就不写了,可以看看这里。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define P 1000000007
using namespace std;
int n,m,inv128=570312504,inv384=190104168;
int add(int x,int y) {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y) {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y) {return 1ll*x*y%P;}
int power(int a,int b){int ans=1;for(;b;b>>=1,a=mul(a,a)) if(b&1) ans=mul(ans,a);return ans;
}
int main(){scanf("%d%d",&n,&m);if(n>m) swap(n,m);if(n==1) printf("%d\n",power(2,m));else if(n==2) printf("%d\n",mul(4,power(3,m-1)));else if(n==3) printf("%d\n",mul(112,power(3,m-3)));else{if(m==n) printf("%d\n",(83ll*power(8,n)%P+5ll*power(2,n+7)%P)*inv384%P);else printf("%d\n",(83ll*power(8,n)%P+power(2,n+8))*power(3,m-n-1)%P*inv128%P);}return 0;
}
【NOIP 2018 提高组】填数游戏相关推荐
- 【题解】[NOIP2018 提高组] 填数游戏
题意 给你一个 01 矩阵,一条从左上到右下的路径,可以表述为 DR 的字符串和 01 串.构造填数方案,满足 DR 串小的 01 串一定大. Solution: 考点:数学+搜索+找规律/推式子. ...
- NOIP 2018提高组复赛C/C++试题及答案详解
NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...
- NOIP 2018 提高组初赛试题 题目+答案+简要解析
一.单项选择题(共 10 题,每题 2 分,共计 20 分: 每题有且仅有一个正确选项) 1. 下列四个不同进制的数中,与其它三项数值上不相等的是( ). A. (269) 16 B. (617 ...
- 【NOIP 2018 提高组】赛道修建
传送门 problem C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mmm 条赛道. C 城一共有 nnn 个路口,这些路口编号为 1,2,-,n1,2,-,n1,2,-,n,有 n−1 ...
- NOIP 2018 普及组 初赛
NOIP 2018 普及组 初赛 姐妹篇 NOIP 2018 提高组 初赛 点评 欢迎查阅此文 https://blog.csdn.net/mrcrack/article/details/830489 ...
- 2018D2T2 P5023 填数游戏
P5023 填数游戏 https://www.luogu.com.cn/problem/P5023 解题参考: https://www.acwing.com/activity/content/code ...
- 1908: 【18NOIP提高组】填数游戏
[题目描述] 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个n×mn×m的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 00 或者数字 11),填数时需要满足 ...
- 【NOIP2018提高组D2T2】填数游戏
前言--2020.10.17 下面的公式推导似乎有些出锅,具体情况就看图想想. Description 小D特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个n*m的矩形表格.玩家 ...
- [NOIP 2013提高组]转圈游戏 题解
这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...
最新文章
- alibaba sentinel限流组件 源码分析
- c++:MFC _cstring.h库常用函数
- 统计gitlab代码行脚本_详解代码统计工具cloc--计算文件数、空白行数、注释行和代码行...
- 电脑数据存储工具----光盘驱动器
- Item-Based Collaborative Recommender System
- 程序员的职业素养---转载
- Rails开发细节《六》ActiveRecord Validationa and Callbacks验证和回调
- 微服务/分布式面试题与基础知识总结汇总
- Ubuntu 19.04 缺少libpng12.so.0
- JAVA 图片URL地址转Byte文件流
- 单臂路由及链路聚合+实验配置(均使用思科模拟器Cisco Packet Tracer Student)
- docker insecure-registry
- 推荐下阿里巴巴开源的数据库客户端工具Chat2DB
- 关于学校edu邮箱登录第三方邮件客户端(例如Outlook、Foxmail、QQ邮箱、邮件App等)的注意事项
- 公司企业常见部门名称英译(zt)
- 这可能是全网Java学习路线最完整,最详细的版本了,没有之一
- 智能电话机器人(AI语音机器人)时什么?
- hadoop学习-1
- add_months用法解析
- eclipse各个版本介绍说明