Submission #77890

#TimeUsernameProblemLanguageResultExecution timeMemory
77890triplem5ds캥거루 (CEOI16_kangaroo)C++14
51 / 100
1086 ms135728 KiB
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")

#include <bits/stdc++.h>

using namespace std;

using ii = pair<int,int>;
using ll = long long;

const int N = 2e5+5;
const int mod = 1e9 + 7;

/*
    IDEA:
    Solution for first subtask is a mask where dp[idx][mask][lastDir]
    Solution for second and third subtask is dp[CForder][L][R][lastDir] as long as i don't go to
    the CF cell i am safe
*/

int dp[205][205][205][2];

int solve(int ord, int l, int r, bool f){
    if(l+r == 1)
        return (l && (!f)) || (r && f);
    int &ret = dp[ord][l][r][f];
    if(~ret)
        return ret;
    ret = 0;
    if(!f){
        for(int i = 0; i < l; i++){
            /// i'll jump to the i-th cell
            if(ord == i)continue;
            if(i < ord){
                ret += solve(ord-1,i,r+(l-i-1),f ^ 1);
            }   else{
                ret += solve(ord,i,r+(l-i-1),f ^ 1);
            }
            if(ret >= mod)
                ret -= mod;
            }
    }  else{
        for(int i = 0; i < r; i++){
            if(l + i == ord)continue;
            if(l + i < ord){
                ret += solve(ord-1,l+i,r-i-1,f^1);
            }   else {
                ret += solve(ord,l+i,r-i-1,f^1);
            }
            if(ret >= mod)ret -= mod;
        }
    }
    return ret;
}


int main(){
#ifdef ONLINE_JUDGE
    ios_base::sync_with_stdio(0);
    cin.tie(0);
#endif // ONLINE_JUDGE
    memset(dp,-1,sizeof dp);
    int n, cs, cf;
    cin >> n >> cs >> cf;
    cs--,cf--;
    cout << (solve(cf-(cs<cf),cs,n-cs-1,1) + solve(cf-(cs<cf),cs,n-cs-1,0))%mod << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...