Это проблема конкурса (ACM ICPC South America 2015), это было самое сложное в задаче.Как решить эту сложную комбинаторную?
Резюме: данных целых чисел N и К, подсчитать число последовательностей длины N, состоящий из целых чисел ≤ я ≤ K, при условии, что для любого x в этом разделе ENCE там должен быть парой I, J удовлетворяющих я < J и я = х - 1 и J = х, т.е. последним x предшествует x - 1 в какой-то момент.
Пример: для N = 1000 и К = 100 решения должен быть конгруэнтен по модулю 265428620 (10 + 7). Другие примеры и подробности можно найти в the problem description.
Я пробовал все, что я знаю, но мне нужны указатели, чтобы знать, как это сделать. Я даже распечатал несколько списков с грубой силой, чтобы найти шаблон, но мне это не удалось.
Я ищу алгоритм или формулу, которая позволяет мне найти правильное решение этой проблемы. Это может быть любой язык.
EDIT:
Я решил проблему, используя формулу я нашел в Интернете (кто-то, кто объяснил эту проблему). Однако только потому, что я запрограммировал его, это не значит, что я это понимаю, поэтому вопрос остается открытым. Мой код здесь (онлайн судья возвращает Accepted):
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll mod = 1e9+7;
ll memo[5001][5001];
ll dp(int n, int k){
// K can't be greater than N
k = min(n, k);
// if N or K is 1, it means there's only one possible list
if(n <= 1 || k <= 1) return 1;
if(memo[n][k] != -1) return memo[n][k];
ll ans1 = (n-k) * dp(n-1, k-1);
ll ans2 = k * dp(n-1, k);
memo[n][k] = ((ans1 % mod) + (ans2 % mod)) % mod;
return memo[n][k];
}
int main(){
int n, q;
for(int i=0; i<5001; i++)
fill(memo[i], memo[i]+5001, -1);
while(scanf("%d %d", &n, &q) == 2){
for(int i=0; i<q; i++){
int k;
scanf("%d", &k);
printf("%s%lld", i==0? "" : " ", dp(n, k));
}
printf("\n");
}
return 0;
}
Наиболее важные линий являются рекурсивным вызовом, в частности, эти линии
ll ans1 = (n-k) * dp(n-1, k-1);
ll ans2 = k * dp(n-1, k);
memo[n][k] = ((ans1 % mod) + (ans2 % mod)) % mod;
Вы должны указать полное определение того, что вам нужно на этой странице. Ссылки на ваш вопрос содержание считаются плохими. Как вы хотите увидеть результат? Например, может ли Python-код быть ответом? –
Да, любой код или формула, которая находит ответ, является ответом, который я бы оценил. Я просто хочу знать, как мне ее решить или проанализировать. –
Проблема очень сложная. Я потратил 15 минут, пытаясь понять проблему и потерпел неудачу. Возможно, я попробую это позже. –