제출 #6841

#제출 시각아이디문제언어결과실행 시간메모리
6841qja0950없는 등수 찾기 (GA7_rank)C++98
0 / 100
4 ms1104 KiB
#include <stdio.h>

#define MAXN 292
#define MOD 1000000007

int N, M, R;
int A[MAXN], B[MAXN];
long long All=1;
void INPUT() {
    scanf("%d %d", &N, &M);
    for(int i=1; i<=N; i++) {
        scanf("%d %d", &A[i], &B[i]);
        All*=(long long)(B[i]-A[i]+1);
        All%=MOD;
    }
    scanf("%d", &R);
}
long long Dy[2][MAXN][3];
void PROCESS() {
    long long Ans=All;
    for(int p=0; p<=M; p++) {
        for(int t0=0; t0<2; t0++)
            for(int t1=0; t1<=N; t1++)
                for(int t2=0; t2<=N; t2++)
                    Dy[t0][t1][t2]=0;
        Dy[0][0][0]=1;
        for(int i=1; i<=N; i++) {
            int over, same, under;
            if(A[i]<=p && p<=B[i]) over=B[i]-p;
            else if(p<A[i]) over=B[i]-A[i]+1;
            else over=0;

            if(A[i]<=p && p<=B[i]) under=p-A[i];
            else if(B[i]<p) under=B[i]-A[i]+1;
            else under=0;


            if(A[i]<=p && p<=B[i]) same=1;
            else same=0;

            for(int j=0; j<=N; j++) {
                for(int k=0; k<=1; k++) {
                    Dy[i%2][j][k]=Dy[1-i%2][j][k]*(long long) under;
                    Dy[i%2][j][k]%=MOD;
                }
            }
            for(int j=0; j<=N; j++) {
                for(int k=0; k<=1; k++) {
                    Dy[i%2][j+1][k]+=Dy[1-i%2][j][k]*(long long)over;
                    Dy[i%2][j+1][k]%=MOD;

                    Dy[i%2][j][k+1]+=Dy[1-i%2][j][k]*(long long)same;
                    Dy[i%2][j][k+1]%=MOD;
                }
            }
        }
        Ans+=(MOD-Dy[N%2][R-1][1]);
        Ans%=MOD;
    }
    printf("%lld\n", Ans);
}
int main() {
//  freopen("input", "r", stdin);
    INPUT();
    PROCESS();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...