제출 #580517

#제출 시각아이디문제언어결과실행 시간메모리
580517andrei_boaca캥거루 (CEOI16_kangaroo)C++14
51 / 100
2083 ms31840 KiB
#include <bits/stdc++.h>

using namespace std;
ifstream fin("kangaroo.in");
ofstream fout("kangaroo.out");
typedef long long ll;
const ll mod=1e9+7;
ll n,cs,cf,dp[2][2005][2005][2],suma[2005][2005][2];
int main()
{
    cin>>n>>cs>>cf;
    dp[0][1][2][1]=1;
    dp[0][2][1][0]=1;
    for(int f=1;f<=2;f++)
        for(int s=1;s<=2;s++)
            for(int j=0;j<=1;j++)
                suma[f][s][j]=(suma[f][s-1][j]+dp[0][s][f][j])%mod;
    for(int i=3;i<=n;i++)
    {
        for(int s=1;s<=i;s++)
            for(int f=1;f<=i;f++)
            {
                dp[1][s][f][0]=0;
                dp[1][s][f][1]=0;
                if(s==f)
                    continue;
                if(s<f)
                {
                    ll x=s-1;
                    ll y=f-s-1;
                    ll z=i-f;
                    dp[1][s][f][0]=suma[x+y+1][x][1];
                    dp[1][s][f][1]=suma[x+y+1][x+y+z+1][0]-suma[x+y+1][x][0];
                    if(dp[1][s][f][1]<0)
                        dp[1][s][f][1]+=mod;
                }
            }
        for(int s=1;s<=i;s++)
            for(int f=1;f<=i;f++)
            {
                if(s==f)
                    continue;
                if(s>f)
                {
                    if(i%2==0)
                    {
                        dp[1][s][f][0]=dp[1][f][s][1];
                        dp[1][s][f][1]=dp[1][f][s][0];
                    }
                    else
                    {
                        dp[1][s][f][0]=dp[1][f][s][0];
                        dp[1][s][f][1]=dp[1][f][s][1];
                    }
                }
            }
        for(int f=1;f<=i;f++)
            for(int s=1;s<=i;s++)
                for(int j=0;j<=1;j++)
                {
                    suma[f][s][j]=(suma[f][s-1][j]+dp[1][s][f][j])%mod;
                    dp[0][s][f][j]=dp[1][s][f][j];
                }
    }
    ll ans=(dp[0][cs][cf][0]+dp[0][cs][cf][1])%mod;
    cout<<ans;
    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...