火车站 题解

题目传送门

题目背景

有一个奇奇怪怪的火车站,奇奇怪怪的站长JTZ想要解决一个奇奇怪怪的问题。
火车站 题解_第1张图片

题目描述

现在有 N N N 列火车要进出站,对于同一列车进站和出站有且只有一次鸣笛,笛声有 1 − M 1-M 1M 种音调,要求相邻的两次鸣笛之间音调的差的绝对值不能小于 K K K (不鸣笛笛声音调看作 1 e 100 1e100 1e100 )。不然耳朵不好的车站管理员XYH分不清楚是哪一列车,现在XYH给出了每一列火车的进出,JTZ想知道总共有多少种鸣笛的方案,而他又不想太麻烦,所以只需要方案数除以 43621789 43621789 43621789 的余数。
某中学八年级大佬RSJ知道了这个消息后,觉得太简单了,几下算出了结果 x x x (取余数后)。于是他想让你算出 M x m o d    43621789 M^x \mod 43621789 Mxmod43621789

输入格式

第一行三个整数 N , M , K N,M,K N,M,K
第二行有 2 N 2N 2N 个整数,每个整数是 0 0 0 1 1 1 代表车进站和出站,保证数据合法,也就是说当车站没有车的时候没有车出站,最后车站没有车。

输出格式

一行,表示答案。( M x m o d    43621789 M^x \mod 43621789 Mxmod43621789 )

输入输出样例

输入#1

2 1 0
0 0 1 1

输出#1

1

输入#2

3 5 2
0 0 0 1 1 1

输出#2

40308287

提示/说明

图非常重要

样例解释:

样例1: x = 4 , M = 1 x=4,M=1 x=4,M=1 答案为 1 4 m o d    43621789 = 1 1^4 \mod 43621789=1 14mod43621789=1
样例2: x = 250 , M = 5 x=250,M=5 x=250,M=5 答案为 5 250 m o d    43621789 = 40308287 5^{250} \mod 43621789=40308287 5250mod43621789=40308287

数据范围

本题采用 Subtask
Subtask  1 \text{Subtask}\ 1 Subtask 1: 测试点 1 − 5 1-5 15 30 % 30\% 30% N ≤ 3 , M ≤ 7 N\le 3,M\le 7 N3,M7
Subtask  2 \text{Subtask}\ 2 Subtask 2: 测试点 6 − 12 6-12 612 40 % 40\% 40% N ≤ 100 , M ≤ 7 N\le 100,M\le 7 N100M7
Subtask  3 \text{Subtask}\ 3 Subtask 3: 测试点 13 − 20 13-20 1320 40 % 40\% 40% N ≤ 500 , M ≤ 7 N\le 500,M\le 7 N500,M7
你只有通过每个 Subtask \text{Subtask} Subtask 的所有测试点才能获得该 Subtask \text{Subtask} Subtask 的分值。


题目解析

这道题目的出题灵感来自于CF149D。我们只要把火车进站看成左括号,火车出站看成右括号。其实应该是栈。
排列与组合是行不通的,因为对于同一列车进站和出站有且只有一次鸣笛,由于没有要求输出步骤,又可以搜索,考虑DP。无疑是区间DP,因为对于鸣笛的音调会影响到其他的方案数量,那么需要将左右侧的鸣笛音调列入方程转移式。
令函数 f ( i , j , x , y ) f(i,j,x,y) f(i,j,x,y) 为区间 [ i , j ] [i,j] [i,j] 中,左右端点中,左端点的鸣笛音调为 x x x ,右端点的鸣笛音调为 y y y 的种数。不鸣笛记为 0 0 0 。分两种情况考虑。
我们需要预处理出辆火车的进出站,存在数组里,要求能 Θ ( 1 ) \Theta (1) Θ(1) 查询。
情况一:第 i i i j j j 次进出站时相同的车。
那么我们需要枚举 i , j i,j i,j 的音调以及相邻的 i + 1 , j − 1 i+1,j-1 i+1,j1 的音调,并且要保证数据合法。
f ( i , j , x , y ) = ∑ f ( i + 1 , j − 1 , a , b ) f(i,j,x,y)=\sum f(i+1,j-1,a,b) f(i,j,x,y)=f(i+1,j1,a,b)
其中 ∣ a − x ∣ ≥ k |a-x|\geq k axk 或者 x = 0 , a ≠ 0 x=0,a\not=0 x=0,a=0 或者 x ≠ 0 , a = 0 x\not=0,a=0 x=0,a=0
并且 ∣ b − y ∣ ≥ k |b-y|\geq k byk 或者 b = 0 , y ≠ 0 b=0,y\not=0 b=0,y=0 或者 b ≠ 0 , y = 0 b\not=0,y=0 b=0,y=0
并且 x = 0 , y ≠ 0 x=0,y\not=0 x=0,y=0 或者 x ≠ 0 , y ≠ 0 x\not= 0,y\not= 0 x=0,y=0

情况二:第 i i i j j j 次进出站时不是相同的车。
设第 i i i 辆车的出站为 m i d mid mid ,那么就可以将区间 [ i , j ] [i,j] [i,j] 分割成区间 [ i , m i d ] , [ m i d + 1 , j ] [i,mid],[mid+1,j] [i,mid],[mid+1,j] ,然后枚举四个端点音调的即可,也要保证数据合法。
f ( i , j , x , y ) = ∑ f ( i , m i d , x , a ) × f ( m i d + 1 , b , y ) f(i,j,x,y)=\sum f(i,mid,x,a)\times f(mid+1,b,y) f(i,j,x,y)=f(i,mid,x,a)×f(mid+1,b,y)
其中 ∣ a − b ∣ ≥ x |a-b|\geq x abx 或者 a = 0 , b ≠ 0 a=0,b\not=0 a=0,b=0 或者 a ≠ 0 , b = 0 a\not= 0,b=0 a=0,b=0
并且 x = 0 , a ≠ 0 x=0,a\not=0 x=0,a=0 x ≠ 0 , a = 0 x\not= 0,a=0 x=0,a=0 (因为 x , a x,a x,a 同一辆车)

最后注意一些细节就可以了。
算法复杂度是 Θ ( N 2 M 4 + N ) \Theta \left( N^2M^4+N\right) Θ(N2M4+N) 的,虽然可以优化成 Θ ( N 2 M 3 + N ) \Theta \left( N^2M^3+N\right) Θ(N2M3+N) 但是因为我懒所以我就不写了。

最后记得输出 M x m o d    43621789 M^x \mod 43621789 Mxmod43621789 ,记得加上快速幂和 long long。

你可能感兴趣的:(题解,算法,动态规划,c++)