質問の意味簡単に言えば:
所与\(1 \) 〜\(\ N-)置換されている、アレイはに分割されている\(K \)の間隔、その結果、各間隔と最大の最大値。この値は、プログラム・パーティションの数を検索します。
キーがある\(1 \) 〜\(\ N-)に交換。
もちろん、あなただけ置く- (K + 1 \ nは\ ) にする(N \)\この段落、各サブセクション(ランダムポイントの残りの部分)。
明らかに最初の答えは、描画することができます。
\ [(N-K + 1)+(N-K + 1)+ \ cdots +(N-1)+ N \]
(もちろん、あなたが等差数列の和を使用することができますが、必要ではないであろう、第二は、答えを求めながら、とき、あなたはああ方法を見つけることができます)
例えば:(第三のサンプルに、例えば)
7 3
2 7 3 1 5 4 6
そして、あなたが入れた\(5 \)、\ (6 \)、\ (7 \)各区間の最大値として。
この時点で、あなたは、たとえば、わかります\(3 \空間1 \)この段落。
これは、どちらかのすべてに行くだ(7 \)\すべての下で、(5 \)\、または2つのセクションに分かれ、左リターン(\ 7 \) 、リターンの右\(5 \) 。
だから、あなたが思う、これはあなたがセグメントでそれを置くことができ、任意の位置に相当します。(左端と右端、この期間に属してやる含みます)
その後、プログラムの数がある(3 \)\。
されている\(5 \)位置が減算される(\ 7 \)位置、すなわち\( - 2 = 3 \ 5) 。
そして、三つの部分の合計は、算出しました。よると、乗算原則ご利用いただけます:
\ [1 \回3 \回2 = 6 \]
従って、第2の答えは次のとおりです。
各\(\ GEQ N - K + 1 \) 前の数の\(\ GEQ N - K + 1 \) の位置の数の差との積。
最初のゼロ(\ GEQ N - K + 1 \)\ 数字の位置が、我々は信じている\(0 \) 。
開くことを忘れないでください\(\ textttロングロング} {\) 。
OI無益十年は、父親を見て、長い長い開けません
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD=998244353;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,k,last;
ll s=0,cnt=1;
int main(){
n=read(),k=read();
for(int i=1,t;i<=n;i++) {
t=read(); if(t>n-k) {
s+=t; if(!last) last=i; //维护上一个 >= n - k + 1 的数的位置
else cnt=cnt*(i-last)%MOD,last=i; //计数
}
} printf("%lld %lld\n",s,cnt);
return 0;
}