이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define optimizar_io ios_base::sync_with_stdio(0);cin.tie(0);
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<long long, long long> pll;
typedef pair<pll, long long> plll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<long long> vl;
typedef vector<vector<long long>> vll;
typedef vector<pii> vpii;
typedef vector<piii> vpiii;
typedef vector<pll> vpll;
typedef vector<plll> vplll;
typedef vector<vector<plll>> vvplll;
typedef vector<vector<pll>> vvpll;
typedef vector<vector<piii>> vvpiii;
typedef vector<vector<pii>> vvpii;
#define pb push_back
#define mp make_pair
#define data data_
#define endl "\n"
#define isOn(S, j) (S & (1ll << (j)))
#define setBit(S, j) (S |= (1ll << (j)))
#define clearBit(S, j) (S &= ~(1ll << (j)))
#define toggleBit(S, j) (S ^= (1ll << (j)))
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
const long long MOD = 1000000007;
int main(){
optimizar_io;
int N, cs, cf;
cin >> N >> cs >> cf;
long long dp[N+2][N+2]; //dp[i][j] number of ways to create j chunks with the i first elements fulfilling the
//alternating conditions. Each chunk has an odd number of elements and starts increasing
//and finishes decreasing, except maybe the first and last one, which can start and finish
//in either direction
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
bool startPlaced = false, endPlaced = false;
for (int i = 1; i <= N; i++){
for (int j = 1; j <= i; j++){
if (i == cs){//It must be placed in the first position
startPlaced = true;
dp[i][j] = dp[i-1][j-1];//place it alone
dp[i][j] += dp[i-1][j];//Tie it to a chunk
dp[i][j] %= MOD;
if ((j == 1) && (endPlaced)) { dp[i][j] = 0; }
} else if (i == cf){//It must be placed in the last position
endPlaced = true;
dp[i][j] = dp[i-1][j-1];//place it alone
dp[i][j] += dp[i-1][j];//Tie it to a chunk
dp[i][j] %= MOD;
if ((j == 1) && (startPlaced)){ dp[i][j] = 0; }
} else { //It must be placed between two existing chunks or placed alone
dp[i][j] = 0;
dp[i][j] += dp[i-1][j+1] * (j);//Unir dos exisentes de los j + 1 (j opciones)
dp[i][j] %= MOD;
int options = j - 2;
if (!startPlaced) options++;
if (!endPlaced) options++;
if (options >= 1){
dp[i][j] += dp[i-1][j-1] * (options);//Ponerlo entre cualquiera de los j - 1 (j - 2 opciones) o al principio o al final
dp[i][j] %= MOD;
}
}
}
}
/*for (int i = 1; i <= N; i++){
for (int j = 0; j <= N; j++){
cout << dp[i][j] << " ";
}
cout << endl;
}*/
cout << dp[N][1] << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |