Brevemente significado de las preguntas:
Dado un \ (. 1 \) ~ \ (n- \) se sustituye, la matriz se divide en \ (K \) intervalos, de modo que el valor máximo de cada intervalo y el máximo. Encuentra este valor, y el número de particiones del programa.
La clave es \ (. 1 \) ~ \ (n \) reemplazado.
Obviamente, sólo hay que poner el \ (n - k + 1 \ ) a \ (n \) de este párrafo, cada sub-sección de un (el resto de los puntos aleatorios).
Obviamente, la primera respuesta se puede extraer:
\ [(N-k + 1) + (n-k + 1) + \ cdots + (n-1) + n \]
(Obviamente, se puede utilizar la aritmética de suma secuencia, pero no será necesario, cuando el segundo, mientras que la búsqueda de respuestas, se puede encontrar el camino ah )
Por ejemplo :( a una tercera muestra, por ejemplo)
7 3
2 7 3 1 5 4 6
A continuación, se pone \ (5 \) , \ (6 \) , \ (7 \) como el valor máximo de cada intervalo.
En este punto se encuentra, por ejemplo, \ (3 \ espacio de 1 \) en este párrafo.
Es bien todos van a \ (7 \) , todos bajo \ (5 \) , o dividido en dos secciones, la vuelta izquierda \ (7 \) , el derecho al retorno \ (5 \) .
Por lo tanto, usted piensa, esto es equivalente a cualquier posición que usted puede ponerlo en segmentos. (Incluyendo la extrema izquierda y la extrema derecha, pertenecen a este período de tiempo)
Entonces, el número de programa es \ (3 \) .
Está \ (5 \) posición se resta \ (7 \) posición, es decir, \ (5 - 2 = 3 \) .
Y un total de tres tramos, se calcularon. De acuerdo con el principio de multiplicación disponibles:
\ [1 \ times 3 \ times 2 = 6 \]
Por lo tanto, la segunda respuesta es:
Cada \ (\ geq n - k + 1 \) de un número de anterior \ (\ geq n - k + 1 \) el producto de la diferencia del número de posiciones.
El primer cero (\ geq n - k + 1 \) \ posición de los números, creemos que \ (0 \) .
Recuerde abrir \ (\ texttt Long Long} {\) .
OI década inútil, se abre mucho tiempo para ver los padres
#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;
}