https://codeforces.com/contest/1943
D1,D2 Counting Is Fun
如果数组 每次可以 选择连续长度大于1的区间 同时减去1,操作多次以后 所有值变为0,则该数组是好(good)数组
对于 长度n,值范围[0,k]
的 $(1+k)^n$个数组有多少个是好数组 $\mod p$
n D1(400),D2(3000)
$\sum n^2$, D1(2e5),D2(1e7)
$k \le n$
$p\in[10^8,10^9]$ 是质数
3s
1024mb
我的思路
good的充要条件?
首先 两端 不大于a1
如果出现连续3个$a < b > c$
要$b-a\le c$ (b,c同时下降 直到b变为a)或$b-c\le a$ (a,b同时下降 直到b变为c)
都是$b\le a+c$
所以 如果good 一定满足 上面的 两端 和 单峰的条件
那么如果满足 两端 和 单峰条件
对于单峰从左到右, 下降,每个前面的不影响后面的,
因此 这个条件是充要
就dp吧
dp[i][x][y]=
前i-1
个位置合法,第i-1个位置是x,后一个是y的方案数
从第二项开始
然后 ans = sum dp[n][>=x][x]
对于$x\le y$
dp[i+1][x][y] = sum dp[i][...][x]
对于$x > y$
dp[i+1][x][y] = (sum dp[i][t][x], x <= t+y )=sum dp[i][>=x-y][x]
所以
dp[i+1][x][y] = sum dp[i][>=x-y][x]
, 其中 dp[i][<0][x]=0
用 后缀和可以 均摊 O(1) 计算每个x,y
所以有一个 $n n^2$的方法,感觉能过D1, 然后D2 明显TLE
感觉就是需要再次优化效率,然而上面的似乎并不能nxn的矩阵的矩阵乘法
然而 并没有成功优化