제출 #1199407

#제출 시각아이디문제언어결과실행 시간메모리
1199407noyancanturk힘 센 거북 (IZhO11_turtle)C++20
10 / 100
33 ms9412 KiB
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int> 
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " << 
#define all(x) x.begin(),x.end()
using namespace std;
int phi = 1;
int n,m,k,t,z;
int Z;

int add(int x,int y) {
    if (x+y >= Z) return x+y-Z;
    return x+y;
}

int mult(int x,int y) {
    return (x*y)%Z;
}

int expo(int x,int y){
    if (!y) return 1;
    int e = expo(x,y/2);
    e = mult(e,e);
    if (y&1) e = mult(e,x);
    return e;
}

int r(int x,int y) {
    if (x < y) return 0;
    return x/y+r(x/y,y);
}

const int N = 1e6+1;

vi primes;
vi sieve(N,0);
int nck(int n,int k) {
    if (n < k || k < 0 || n < 0) return 0;
    int ans = 1;
    for (auto it : primes) {
        int a = r(n,it);
        if (!a) break;
        int b = r(k,it),c = r(n-k,it);
        ans = mult(ans,expo(it,a-b-c));
    }    
    return ans;
}

void solve() {
    cin >> n >> m >> k >> t >> z;
    Z = z;
    for (int i=2;i<N;i++) {
        if (!sieve[i]) {
            sieve[i] = i;
            primes.push_back(i);
            for (int j = i*i;j<N;j+=i) sieve[j] = i;
        }
    }
    vector<pii> traps(k+2);
    traps[0] = {0,0},traps[1] = {n,m};
    for (int i = 2;i<k+2;i++) cin >> traps[i].ff >> traps[i].ss;
    sort(all(traps));
    int ways[k+2][k+2];
    for (int i = 0;i<k+2;i++) {
        ways[i][i] = 1;
        for (int j = i-1;j>=0;j--) {
            ways[j][i] = nck(traps[i].ff-traps[j].ff+traps[i].ss-traps[j].ss,traps[i].ff-traps[j].ff);
            for (int jj = j+1;jj<i;jj++) {
                ways[j][i] = add(ways[j][i],Z-mult(ways[j][jj],ways[jj][i]));
            }
        }
    }
    int dp[k+2][t+2]{};
    dp[0][0] = 1;
    for (int j = 1;j<=t+1;j++) {
        for (int i=1;i<k+2;i++) {
            dp[i][j] = 0;
            for (int jj = 0;jj<i;jj++) {
                dp[i][j] = add(dp[i][j],mult(dp[jj][j-1],ways[jj][i]));
            }
        }
    }
    int ans = 0;
    for (int i = 1;i<=t+1;i++) ans = add(ans,dp[k+1][i]);
    cout << ans << '\n';
}

signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...