[loj6388] 「THUPC2018」赛艇 / Citing

Description

​ 给你一个\(~n \times m~\)的\(~01~\)矩阵,一个人在这个矩阵中走了\(~k~\)步,每一次都往四联通方向中的一个走一步。给定这个人每一步走的方向,已知这个人经过的每一步都没有经过原矩阵中\(~1~\)的位置。问合法的起点有多少种?保证至少有一组解。\(~1 \leq n, m \leq 1500, ~k \leq 5 \times 10 ^ 6~\).

Solution

​ 不难发现那条路径通过补全\(~0~\)之后其实就是一个\(~01~\)矩阵,其中的\(~1~\)就是原路径。问题变成了把该矩阵放在原矩阵中(严格内含)不产生冲突的方案数,实质上就是或起来全是\(~0~\)的方案数。考虑怎么快速求这个问题。把该矩阵通过补\(~0~\)变成和原矩阵一样大的规模,把两个矩阵都拉成长度为\(~n \times m~\)的序列,倒序一个序列做\(~FFT~\)或\(~NTT~\)在看对应位置上是否为\(~0~\)统计答案即可。至于这样为什么是对的,可以考虑这个对应位置的数代表的东西到底是什么,卷积中\(~ans_i~\)代表下标和为\(~i~\)的各项乘积之和,由于之前做过一个区间反转,所以这个\(~ans_i~\)就代表路径矩阵在原矩阵中起始位置为\(~i~\)时矩阵各项匹配起来的乘积的和,而在只有\(~0, 1~\)的情况下,乘法和或的运算法则一样。所以当\(~ans_i~\)为\(~0~\)时,就代表这个匹配位置是合法的,因为没有任何一个\(~1~\)同位。

Code

#include<bits/stdc++.h>
#define For(i, j, k) for(int i = j; i <= k; ++i)
#define Forr(i, j, k) for(int i = j; i >= k; --i)
using namespace std;

inline int read() {
    int x = 0, p = 1; char c = getchar();
    for(; !isdigit(c); c = getchar()) if(c == '-') p = -1;
    for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return x *= p;
}

inline void File() {
#ifndef ONLINE_JUDGE
    freopen("loj6388.in", "r", stdin);
    freopen("loj6388.out", "w", stdout);
#endif
}

const int N = 1500 + 10, M = (N * N) << 2, mod = 998244353;
int a[M], b[M], rev[M], powg[M], invg[M], k;
int n, m, cnt1, cnt2, siz, len, bit, c[N << 1][N << 1];
char ss[M]; 

inline int qpow(int a, int b) {
    static int res;
    for (res = 1; b; a = 1ll * a * a % mod, b >>= 1)
        if (b & 1) res = 1ll * res * a % mod;
    return res;
}

inline void NTT(int *a, int flag) {
    For(i, 0, siz - 1) if (rev[i] > i) swap(a[rev[i]], a[i]);
    for (int i = 2; i <= siz; i <<= 1) {
        int wn = flag ? powg[i] : invg[i];
        for (int j = 0; j < siz; j += i) {
            int w = 1;
            for (int k = 0; k < (i >> 1); ++ k, w = 1ll * w * wn % mod) {
                int x = a[j + k], y = 1ll * w * a[j + k + (i >> 1)] % mod;
                a[j + k] = (x + y) % mod, a[j + k + (i >> 1)] = (x - y + mod) % mod;
            }
        }
    }
    if (!flag) {
        int g = qpow(siz, mod - 2);
        For(i, 0, siz) a[i] = 1ll * a[i] * g % mod;
    }
}

int main() {
    File();
    n = read(), m = read(), k = read();

    For(i, 1, n) {
        scanf("%s", ss + 1);
        For(j, 1, m) a[(i - 1) * m + j - 1] = ss[j] - 48;
    }
    cnt1 = n * m - 1;

    int x2 = n, y2 = m, x0 = n, y0 = m, lx = n, ly = m;
    scanf("%s", ss + 1), c[lx][ly] = 1; 
    For(i, 1, k) {
        if (ss[i] == 'w') c[-- lx][ly] = 1;
        if (ss[i] == 'a') c[lx][-- ly] = 1;
        if (ss[i] == 's') c[++ lx][ly] = 1;
        if (ss[i] == 'd') c[lx][++ ly] = 1;
        x0 = min(x0, lx), y0 = min(y0, ly);
        x2 = max(x2, lx), y2 = max(y2, ly);
    }

    For(i, x0, x0 + n - 1) For(j, y0, y0 + m - 1) b[cnt1 - (cnt2 ++)] = c[i][j];
    -- cnt2;

    len = cnt1 + cnt2;
    for (siz = 1; siz <= len; siz <<= 1) ++ bit;
    For(i, 0, siz - 1) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); 

    int g = qpow(3, mod - 2);
    for (int i = 1; i <= siz; i <<= 1) {
        invg[i] = qpow(g, (mod - 1) / i);
        powg[i] = qpow(3, (mod - 1) / i);
    }

    NTT(a, 1), NTT(b, 1);
    For(i, 0, siz - 1) a[i] = 1ll * a[i] * b[i] % mod;
    NTT(a, 0);
    
    int ans = 0;
    For(i, 1, n - (x2 - x0)) For(j, 1, m - (y2 - y0)) 
        if (a[cnt1 + (i - 1) * m + j - 1] == 0) ++ ans; 

    cout << ans << endl;
    return 0;
}

转载于:https://www.cnblogs.com/LSTete/p/9519814.html

生命游戏(c语言) 介绍 生命游戏其实是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。 截图:代码://定义二维世界 __int8 world[152][152] = { 0 } 阅读详情

相关推荐

MobaXterm终端工具个人学习版安装包及常用配置备份

资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。

LeetCode1391 :检查网络中是否存在有效路径

分析:路径选择,一定是在上下左右中选择一条,如果存在路径的话,对每一条可行的路径进行测试;如果都不可选择的话,则不存在路径。 我们先确定当前位置,查看当前位置上该往哪走,然后再往相应的方向上行进,进入下一个。因为在每个位置上,其下一步是固定不变的,我们只需在上下左右中寻找到符合其行走条件的路径即可(如果存在的话)。 bool helper(int** grid, int gridSize, int...

qq_44709743的博客 355

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

「THUPC2018」赛艇 / Citing

https://loj.ac/problem/6388 矩形匹配,小地图经过位置为1,和大地图匹配不能同时存在一个1的位置,就可以是一个当前位置 1.bitset压位,。。。。O(n^2m^2/64)可过。。 2.NTT字符串匹配 把n*m的大地图拆成长条,小地图放到n*m的左上角,也拆成长条, 两个一维数组匹配,小地图翻转,NTT 统计答案的时候,如果不会出现距离边界的宽度小于小地图...

weixin_34161032的博客 275

联想服务器ThinkSystemRAID阵列设置教程

关注我不迷路,全是干货! 以联想ThinkSystemSR530为例子进行示范。 开机点按【F1】 点击——【UEFI设置】 依次点击——【系统设置】——【存储】 点击——【RAID卡】 PS:本次服务器配置的是730-8i 阵列卡,按实际情况选中需要设置的阵列卡即可。 点击——【Main Menu】 点击——【Configuration Management】 点击——【Create Virtual Drive】 点击——【Select RAID Leve..

littlelotusK的博客 2万+

英飞凌 TC4X MCAL之SPI中断与DMA高效传输实战

本文详细介绍了英飞凌TC4X芯片的SPI通信实战,重点讲解如何通过MCAL配置SPI中断与DMA实现高效数据传输。针对汽车电子领域的高吞吐需求,提供了从基础配置到中断处理、DMA优化的完整解决方案,包含代码示例和调试技巧,帮助开发者提升系统性能与CPU利用率。

k0l1m2n3o的博客 874

LOJ6388:[THUPC2018]赛艇——题解

https://loj.ac/problem/6388 如果你做过BZOJ5217:[Lydsy2017省队十连测]航海舰队的话,那么恭喜你,这道题就是大水题。 如果你做过BZOJ4259:残缺的字符串的话,那么基本的字符串匹配FFT也是能想到的。 如果没做过的话,很抱歉,没有一定的套路的话这道题很难想(而对于我这样的蒟蒻来说就是没法想。) 将行走路线看做一个地图b,走过的路为1,没走...

weixin_34289744的博客 195

【Halcon】双目立体视觉引导机械手有序抓取,案例分享

本文介绍了一个基于双目视觉的工件定位与抓取系统。该系统使用两个工业相机组成双目视觉系统,通过标定获取相机参数,采用模板匹配算法识别任意摆放且可能交叠的工件。重点阐述了三维坐标获取方法,特别是通过Z方向高度实现有序抓取的策略。文章详细说明了系统搭建、双目标定、模板创建等关键步骤,并展示了特征点匹配和定位结果。该案例为初学者和开发者提供了双目视觉系统的基本实现参考,展示了机器视觉与机械手协同工作的典型应用场景。

机器视觉从业者 2490

【THUPC 2018】赛艇

Problem Description Lavender、Caryophyllus、Jasmine、Dianthus现在在玩一款名叫“赛艇”的游戏。 这个游戏的规则是这样的: 玩家自由组成两队,一个人当赛艇的艇长,另一个人当侦察兵; 每次游戏开始时,双方均拥有由系统生成的某张地图,该地图以01矩阵的形式表示,1表示有障碍物,无法通行,0表示水域空旷,可以通行; 第一回合,双方的赛艇艇长...

洛水·锦依卫's Blog 387

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 649

生命游戏

生命游戏今天大年30~emm,玩游戏累了。。默默的写一下游戏。。。这是这个章节中最后的经典游戏啦~!!!前方高能请注意!!!!!(*?▽?*)本游戏的发展史以及意义生命游戏又称细胞自动游戏,或者元细胞自动机游戏。该游戏有英国数学家J.H.Conway首次提出的。在1970年,J.H.Conway小组正在研究一种细胞自动装置,从中获得启发,提出了一种生命游戏然后将其发布到《科学美国人》的数学游戏专栏...

jiayoudangdang的博客 2563

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3202

【FFT-类字符串匹配】LOJ6388 [THUPC2018]赛艇 / Citing

【题目】 原题地址 给定一个n×mn\times mn×m的010101矩阵,其中111不能走。给定一个人的行走路线,求所有可能的起点。 【解题思路】 我们考虑将走的路径看作111,然后将走出的路径补000成为一个n×mn\times mn×m矩阵。现在的问题就转化为在原矩阵中放一个矩阵,使得两个矩阵的或为000,求方案数。 将矩阵展开为一维后,实际上就是对应位置上的或值为000。 由于只有000...

MEET YOU FIRST TIME 497

Python之ae-toolbox包语法、参数和实际应用案例

ae-toolbox(全称 after-effects-toolbox)是 Python 生态中专门用于 Adobe After Effects(AE)自动化操作 的工具包,基于 AE 的 ExtendScript(JSX)桥接技术,实现 Python 与 AE 的跨语言通信。

王国平的博客 1174

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 713

[#LOJ6388] [THUPC2018] 赛艇 快速傅里叶变换 FFT

题目链接 今天ShichengXiaoShichengXiaoShichengXiao讲了卷积相关..这是PPTPPTPPT上的题 首先这个题 大意就是给你一个大的和一个小的0/10/10/1矩阵,然后你把小的对齐到大的上面,统计有多少种方案不会出现有两个111重叠 这个题感觉很套路(巧妙)啊 如果两项是1那这两项乘起来就是111 我们就可以考虑把它转换为乘法形式,就定义一个点的权值就是把...

lunch__的博客 363

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

poj2923 状压记忆化搜索

题意:n个货物,第i个重量为Wi,有两只船,载重分别为C1,C2。问至少需要两艘船运几趟才能将n个货物运完。 解法:由于n小于等于10,可以联想到状态压缩。求出两艘船一次可以运送的状态(将两个船分别一次可以运送的状态取 ‘或’ 就可以了)。然后就是常规的记忆化搜索。 代码:#include #include #include using namespace std; int wo

xiefubao的专栏 785

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode-289. 生命游戏

根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则该位...

yongqi_wang的博客 368

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LOJ6387 [THUPC2018] 绿绿与串串 【manacher】

题目分析: 比较简单,先跑一边manacher,然后对于回文部分可以碰到末尾的一定满足条件,否则向后转移。 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 1000020; 5 6 char str[maxn],solve[maxn<<1]...

weixin_30532837的博客 169

[THUPC2018]生生不息(???)

SB题,写来放松身心。 首先 $n,m\le 5$,这是可以打表的。 本地怎么对于一个 $n,m$ 求答案?此时虽然复杂度不需要太优,但是还是得够快。 一个想法是枚举每个初始状态,不停模拟。因为总状态数只有 $O(2^{nm})$ 种,所以会出现周期。 如果压缩状态,复杂度是 $O(4^{nm}nm)$。太大了。 但是,虽然一个状态的周期可能很长,但是如果一起考虑所有状态呢?...

angzuo8655的博客 239

「THUPC2018」生生不息 / Lives(状压 + 记忆化搜索 + 打表)

题目链接:https://loj.ac/problem/6398 题目大意:        生命游戏是一个经典的零玩家游戏。        游戏在一块 n \times mn×m 的方格棋盘上进行,初始时,棋盘上的一些格子中有生命,另一些格子中没有生命。        在新的一天开始时,如果一个格子周围的 88 个(边界上的格子也许不到 88 个)格子中,在前一天有恰好22个或33个格子中...

CourierLo的博客 529

LeetCode 每日一题 289. 生命游戏 详细题解 C++描述

LeetCode 每日一题 289. 生命游戏 2020.04.02 难度 中等 题目 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的...

一起加油 7241
上一篇: 2018.08.21高二互测
下一篇: 2018.08.23高二互测
baibiaohu4110
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值