Submission #3774943


Source Code Expand

#include "bits/stdc++.h"
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <map>
#include <vector>
#include <math.h>
#include <algorithm>
#include <queue>
#include <set>
#include <tuple>
using namespace std;

#define FOR(i,init,a) for(int i=init; i<a; i++)
#define rep(i,a) FOR(i,0,a)
#define rrep(i,a) for(int i=a; i>=0; i--)
#define rep1(i,a) for(int i=1; i<=a; i++)
#define cout1(a) cout << a << endl;
#define cout2(a,b) cout << a << " " << b << endl;
#define cout3(a,b,c) cout << a << " " << b << " " << c << endl;
#define cout4(a,b,c,d) cout << a << " " << b << " " << c << " " << d << endl;
#define mem(a,n) memset( a, n, sizeof(a))
#define all(a) a.begin(),a.end()
#define chmin(a,b) a=min(a,b);
#define chmax(a,b) a=max(a,b);

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> V;
typedef vector<V> VV;
typedef vector<VV> VVV;
const int INF = 1e9;
const int MOD = 1e9+7;
const ll LLINF = 1e18;
static const double pi = 3.141592653589793;

ll fact[200000], invFact[200000], memo[1009];

long long power(long long x, long long c) {
    if(c==0) return 1;
    if(c==1) return x;
    if (c%2==1) return (power( (x*x)%MOD, c/2)*x)%MOD;
    else return power( (x*x)%MOD, c/2)%MOD;
}

void make_combT(ll n){
    fact[0]=1;
    rep1(i,n) fact[i]= fact[i-1]*i%MOD;
    
    invFact[n] = power(fact[n],MOD-2);
    rrep(i,n-1) invFact[i] = invFact[i+1] * (i+1) %MOD;
}

ll comb(ll n, ll m){
    if(n<m||n<0||m<0) return 0;
    return (fact[n] * invFact[m] %MOD) * invFact[n-m] %MOD;
}

ll inv(int k){
    if(memo[k]) return memo[k];
    return memo[k]=power(k,MOD-2);
}

ll dp[1009][1009];

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    make_combT(1009);
    
    int N,A,B,C,D;
    cin>>N>>A>>B>>C>>D;
    
    rep(i,1009) dp[i][0]=1;
    for(int i=A;i<=B;i++){
        rep(j,N+1)if(dp[i][j]){
            if(j) (dp[i+1][j]+=dp[i][j])%=MOD;
            ll p=1;
            for(int k=1;k<=D&&j+i*k<=N;k++){
                p=(((p*comb(N-j-i*(k-1),i)%MOD)*inv(k))%MOD)%MOD;
                if(k>=C) (dp[i+1][j+i*k]+=(dp[i][j]*p)%MOD)%=MOD;
            }
        }
    }
    cout1(dp[B+1][N])
}

Submission Info

Submission Time
Task E - Grouping
User mensan_fukuhara
Language C++14 (GCC 5.4.1)
Score 600
Code Size 2261 Byte
Status AC
Exec Time 57 ms
Memory 10496 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 4
AC × 15
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, subtask_1_many_01.txt, subtask_1_many_02.txt, subtask_1_many_03.txt, subtask_1_many_04.txt, subtask_1_max_01.txt, subtask_1_max_02.txt, subtask_1_min_01.txt, subtask_1_randa_01.txt, subtask_1_randa_02.txt, subtask_1_randb_01.txt, subtask_1_randb_02.txt
Case Name Status Exec Time Memory
sample_01.txt AC 4 ms 9472 KB
sample_02.txt AC 4 ms 9472 KB
sample_03.txt AC 57 ms 10496 KB
sample_04.txt AC 4 ms 9472 KB
subtask_1_many_01.txt AC 37 ms 9728 KB
subtask_1_many_02.txt AC 48 ms 10496 KB
subtask_1_many_03.txt AC 38 ms 9856 KB
subtask_1_many_04.txt AC 48 ms 10496 KB
subtask_1_max_01.txt AC 4 ms 9472 KB
subtask_1_max_02.txt AC 4 ms 9472 KB
subtask_1_min_01.txt AC 4 ms 9472 KB
subtask_1_randa_01.txt AC 4 ms 9472 KB
subtask_1_randa_02.txt AC 4 ms 9472 KB
subtask_1_randb_01.txt AC 5 ms 9600 KB
subtask_1_randb_02.txt AC 4 ms 9600 KB