题目描述
每天都有火车从农场前经过,它有N个车厢(1≤N≤100000),每个车厢都有一个在1到1e9之间的数字,不同的车厢也有可能有相同的数字。
通常,Bessie看火车经过时,会观察车厢上的数字,但今天有雾,Bessie看不到任何的数字。幸运的是,她已经通过可靠来源知道车厢的所有滑动窗口的最小值,即,她知道一个正整数K和N-K+1的数字,第i个数字Ci表示第i个车厢到第i+K-1这K个车厢中所有数字的最小值。
请你帮助Bessie求出满足这个最小值的车厢的编号方法数量,由于这个数字可能很大,答案对1e9+7取模。
题目保证至少有一种符合编号的情况。
输入格式
第一行输入两个数N和K,接下来N-K+1行,每行输入一个数Ci。
输出格式
输出一个整数,表示答案对1e9+7取模的结果。
样例输入输出
Sample Input 1
4 2
999999998
999999999
999999998
Sample Output 1
3
博文链接
题解
看了别人的博客,自己也手痒来撸一篇
初拿到这道题,我是懵逼的。感觉没有一个点是定的,然后,再仔细一想,如果左边一个点的区间和右边一个点区间的最小值不一样,那么我们可以定下来一个位置的值(相对比较固定)
考虑完了不同的情况,那么相同的情况呢?
此时,你可以码出核心代码了 :
//dp[i] = (1e9 - c[i] + 1) * dp[i - 1] - (1e9 - c[i]) ^ k *dp[i - k - 1]
LL sovle (const int val, const int len) {
LL x = Max - val;
LL power = qkpow (x, k);
dp[0] = dp[1] = 1;
for (int i = 2; i <= len + 1; ++ i) {
dp[i] = 1ll * (x + 1) * dp[i - 1] % mod