QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#882562 | #1816. Multiple Parentheses | Invincible | TL | 0ms | 0kb | C++14 | 2.4kb | 2025-02-05 09:22:59 | 2025-02-05 09:23:00 |
Judging History
answer
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <ctime>
#include <random>
#include <cassert>
#include <numeric>
#include <cmath>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#define pii pair<int, int>
#define fi first
#define se second
#define MP make_pair
#define ep emplace
#define eb emplace_back
//#define int long long
#define rep(i, j, k) for (int i = (j); i <= (k); i++)
#define per(i, j, k) for (int i = (j); i >= (k); i--)
typedef double db;
typedef long double ldb;
typedef long long ll;
//typedef __int128 lll;
typedef unsigned long long ull;
typedef unsigned int ui;
using namespace std;
using namespace __gnu_pbds;
bool Mbe;
//char buf[1<<20],*p1,*p2;
//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin), p1 == p2) ? 0 : *p1++)
int read() {
int s = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') f ^= (c == '-'), c = getchar();
while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
return f ? s : -s;
}
template<typename T>void chkmax(T&x,const T&y){if(x<y)x=y;}
template<typename T>void chkmin(T&x,const T&y){if(x>y)x=y;}
const int N=40000005;
int n,m,k,mod,fac[N],ifac[N],ans,cat[N];
int fplus(int x,int y){return x+y>=mod?x+y-mod:x+y;}
void Fplus(int&x,int y){x=fplus(x,y);}
int fminus(int x,int y){return x-y<0?x+mod-y:x-y;}
void Fminus(int&x,int y){x=fminus(x,y);}
int fpow(int x,int k=mod-2){
int res=1;
for(;k;k>>=1){
if(k&1)res=(ll)res*x%mod;
x=(ll)x*x%mod;
}
return res;
}
int C(int x,int y){return x<y?0:(ll)fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
int F(int x,int y){
if(!x)return !y;
return fminus(C(y+y+x-1,y),C(y+y+x-1,x+y));
}
bool Med;
signed main() {
// freopen("1.in","r",stdin);
// freopen("bracket.in","r",stdin);
// freopen("bracket.out","w",stdout);
fprintf(stderr,"%.3lfMb\n",(&Mbe-&Med)/1024./1024.);
n=read(),m=read(),k=read(),mod=read();
fac[0]=1;
rep(i,1,30000000)fac[i]=(ll)fac[i-1]*i%mod;
ifac[30000000]=fpow(fac[30000000]);
per(i,30000000,1)ifac[i-1]=(ll)ifac[i]*i%mod;
int base=1,pw=(ll)C(k+k,k)*fpow(k+1)%mod;
rep(i,0,min(m/k,n)){
if(i&1)Fminus(ans,(ll)F(n-i,m-i*k)*C(n,i)%mod*base%mod);
else Fplus(ans,(ll)F(n-i,m-i*k)*C(n,i)%mod*base%mod);
base=(ll)base*pw%mod;
}
printf("%d\n",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
2 2 1