luogu

loj

被这道题送退役了

题是挺有趣的,然而可能讨论比较麻烦,肝了2h 又自闭了,鉴于CSP在即,就只能先写个打表题解了

下面令\(n<m\),首先\(n=1\)时答案为\(2^m\),然后打表可以发现,\(\forall i>n+1\ ans_{n,i}=3^{m-(n+1)}ans_{n,n+1}\),现在考虑怎么快速打表

下面记从上往下行编号从\(1\)到\(n\),从左往右列编号从\(1\)到\(m\).要发掘两个性质,第一个是对于一条左下到右上的对角线,填的数一定是先一段1再加上一段0.否则他就会存在一个为0的位置\((i,j)\),满足右上方格子\((i-1,j+1)\)是1,这个时候会有两条从\((1,1)\)到\((i-1,j)\)的重合路径,下一步一条往下走,一条往右走,然后就导致往下走的路径字典序小于往右走的字典序,导致不合法.还有一个性质是如果位置\((i,j)\)满足\((i-1,j)\)格子值等于\((i,j-1)\),那么\(\forall x,y\ x-1\ge i,y\ge j\),要满足\((x,y)\)的值等于\((x-1,y+1)\),否则加上第一条性质,它就会满足\(a_{x,y}=1,a_{x-1,y+1}=0\),那可以有两条路径,分别为\((1,1)\to (i-1,j-1)\to (i,j-1)\to (i,j)\to (x-1,y)\to (x-1,y+1)\),以及\((1,1)\to (i-1,j-1)\to (i-1,j)\to (i,j)\to (x-1,y)\to (x,y)\),前者的字典序是应该大于等于后者的,但是这里显然不成立.可以发现满足这两个性质的方案都是满足要求的

根据这两条性质,我们就可以依次枚举每条左下到右上的对角线,填了多少个1和0.接着考虑第二个性质,我们填数的时候就维护所有\((i,j)\)满足\((i-1,j)\)格子值等于\((i,j-1)\)的位置,然后因为一条对角线只会有一个位置\(a_{x,y}=1,a_{x-1,y+1}=0\),所以使得\((x-1,y)\)左上方矩形内没有上述的\((i,j)\)就行了,这里可以维护一个前缀最小值表示满足\(j \le y\)的位置中上述\((i,j)\)的\(i\)最小值.这样可以在\(200ms\)左右打出\(ans_{8,9}\)

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=1e6+10,mod=1e9+7;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
int n,nn,m,ans,b[10];
bool a[10][10];
void dfs(int x,int y)
{
if(y==n){++ans;return;}
int bb[10];
memcpy(bb,b,sizeof(b));
for(int i=x,j=y;i>=1&&j<=n;--i,++j)
{
a[i][j]=0;
if(i<x&&j>y&&i>1&&j<n&&a[i-1][j]==a[i][j-1]) b[j]=min(b[j],i);
}
for(int j=1;j<=n;++j) b[j]=min(b[j],b[j-1]);
x==nn?dfs(x,y+1):dfs(x+1,y);
for(int i=x,j=y;i>=1&&j<=n;--i,++j)
{
a[i][j]=1;
if(i==1||j==n||b[j]>=i)
x==nn?dfs(x,y+1):dfs(x+1,y);
}
memcpy(b,bb,sizeof(bb));
} int main()
{
n=rd(),m=rd();
if(n>m) swap(n,m);
if(n==1){printf("%d\n",fpow(2,m));return 0;}
for(int i=0;i<=n;++i) b[i]=m+1;
nn=min(m,n+1);
dfs(2,1);
printf("%d\n",(int)(4ll*ans*fpow(3,m-nn)%mod));
return 0;
}

luogu P5023 填数游戏的更多相关文章

  1. 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

    2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...

  2. @NOIP2018 - D2T2@ 填数游戏

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

  3. 【题解】NOIP2018 填数游戏

    题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...

  4. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

  5. NOIP2018 填数游戏 搜索、DP

    LOJ 感觉这个题十分好玩于是诈尸更博.一年之前的做题心得只有这道题还记得清楚-- 设输入为\(n,m\)时的答案为\(f(n,m)\),首先\(f(n,m)=f(m,n)\)所以接下来默认\(n \ ...

  6. 【NOIP 2018】填数游戏(思考与推导)

    题目链接 这道题讲道理还是不错的,因为你需要不断挖掘其中的性质来帮助解题.可惜数据范围开在这里让考试时的我很慌,勉强也就写了$65$分就没了.回忆在考场上,思路是没有错的,就是发掘不够深入,思路还不够 ...

  7. NOIP2018 Day2T2 填数游戏

    下面先给出大家都用的打表大法: 首先我们可以发现 \(n \le 3\) 的情况有 \(65pts\),而 \(n\) 这么小,打一下表何乐而不为呢?于是我写了一个爆枚每个位置再 \(check\) ...

  8. 小C的填数游戏

    题意: 给出一张n个点的无向图 i连向i-1和i-2 边权为wij 有两个点权ai和bi ai为0或1 在给m个操作 1.将ai异或1 2.将区间x到y的点都填上一个数ci 使得Σ(bi*(ai^ci ...

  9. UOJ#440. 【NOIP2018】填数游戏 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ440.html 前言 菜鸡选手到省选了才做联赛题. 题解 首先我们分析一下性质: 1. 假如一个格子是 0,那么它的右上角 ...

随机推荐

  1. (一)OpenCV-Python学习—基础知识

    opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,值得学习和深究下. 1.opencv包安装 · 这里直接安装opencv-python包(非官方): pip install ope ...

  2. error:Cannot pull with rebase

    原文文链接:https://blog.csdn.net/u012385190/article/details/70670213git 执行git pull –rebase报错误如下: error: C ...

  3. appStore上传苹果应用程序软件发布

    首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Portal,然后点击DisTribution(1)图中加号是灰色 ...

  4. 编程语言中的字面量在Objective-C中的举例

    关于计算机编程语言中的字面量的介绍可参考:http://baike.baidu.com/view/1208327.htm?fr=aladdin. 下面就介绍Objective-C中的各种常用字面量: ...

  5. Python操作memecache

    memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,故常用来做数据库缓存.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...

  6. 取消一个本地svn目录与svn的联系

    第一种方法: 直接.逐级地删除目标目录中的隐藏属性的.svn目录 这个方法试了,好牛蛋...,省事,快速... 第二种方法: 如果用的是TortoiseSVN客户端,则先在另外一处建立一个新目录A,右 ...

  7. opengl读取灰度图生成三维地形

    准备第三方库 glew.freeglut.glm.opencv 准备灰度图片和草地贴图 最终效果 代码包括主程序源文件mainApp.cpp.顶点着色器shader.vs.片元着色器shader.fs ...

  8. QFramework 使用指南 2020(八):Res Kit(2)模拟模式与非模拟模式

    在上一篇,介绍了 Res Kit 的基本使用,相信大家已经体会到了 Res Kit 的简便之处了. 在这一篇,我们试着探讨一下 Res Kit 的设计背后原理. AssetBundle 的不便之处 在 ...

  9. Sed---linux系统三剑客(二)

    grep .sed.awk被称为linux中的"三剑客". grep 更适合单纯的查找或匹配文本 sed  更适合编辑匹配到的文本 awk  更适合格式化文本,对文本进行较复杂格式 ...

  10. C#实现隐藏手机号、邮箱、姓名等敏感信息扩展方法

    还是老惯例,直接上代码. 最终效果图: public static class HideSensitiveInfoExtension { /// <summary> /// 隐藏敏感信息 ...