提出 #11228638
ソースコード 拡げる
#include<bits/stdc++.h>
#define ri register int
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
typedef vector<int> poly;
#define pb push_back
const int rlen=1<<18|1,inf=0x3f3f3f3f;
const ll Inf=1e18;
char buf[rlen],*ib=buf,*ob=buf;
#define gc() (((ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin)),ib==ob)?-1:*ib++)
inline int read() {
int ans=0;
bool f=1;
char ch=gc();
while(!isdigit(ch)) f^=ch=='-',ch=gc();
while(isdigit(ch)) ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return f?ans:-ans;
}
inline ll readl() {
ll ans=0;
bool f=1;
char ch=gc();
while(!isdigit(ch)) f^=ch=='-',ch=gc();
while(isdigit(ch)) ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return f?ans:-ans;
}
inline int Read(char*s) {
int tp=0;
char ch=gc();
while(!isdigit(ch)&&!isalpha(ch)) ch=gc();
while(isdigit(ch)||isalpha(ch)) s[++tp]=ch,ch=gc();
return tp;
}
namespace modular {
int mod;
inline int add(int a,int b) { return a+b<mod?a+b:a+b-mod; }
inline int dec(int a,int b) { return a<b?a-b+mod:a-b; }
inline int mul(int a,int b) { return (ll)a*b%mod; }
inline void Add(int&a,int b) { a=a+b<mod?a+b:a+b-mod; }
inline void Dec(int&a,int b) { a=a<b?a-b+mod:a-b; }
inline void Mul(int&a,int b) { a=(ll)a*b%mod; }
inline int ksm(int a,int p) { int ret=1;for(;p;p>>=1,Mul(a,a)) (p&1)&&(Mul(ret,a),1);return ret; }
inline int Inv(int a) { return ksm(a,mod-2); }
inline int sqr(int a) { return mul(a,a); }
inline int cub(int a) { return (ll)a*a%mod*a%mod; }
}
using namespace modular;
template<typename T> inline void ckmax(T&a,T b) { a<b?a=b:0; }
template<typename T> inline void ckmin(T&a,T b) { a>b?a=b:0; }
template<typename T> inline T gcd(T a,T b) { T t;while(b)t=a,a=b,b=t-t/a*a;return a; }
template<typename T> inline T Abs(T x) { return x<0?-x:x; }
const int N=6005;
int C[N][3],n,f[N][N+3005];
int main() {
#ifdef ldxcaicai
freopen("lx.in","r",stdin);
#endif
n=read()*3,mod=read();
for(ri i=0;i<=n;++i) for(ri j=C[i][0]=1;j<=3&&j<=i;++j) C[i][j]=add(C[i-1][j],C[i-1][j-1]);
f[0][3000]=1;
for(ri i=0,trs;i<n;++i) {
for(ri j=-i/2;j<=i;++j) if((trs=f[i][j+3000])) {
for(ri k=1;k<=3&&i+k<=n;++k) {
Add(f[i+k][j+3000+(k<3?(k==1?1:-1):0)],mul(trs,k<3?(k==1?1:(n-i-1)):(n-i-1)*(n-i-2)));
}
}
}
int res=0;
for(ri i=3000;i<=3000+n;++i) Add(res,f[n][i]);
cout<<res;
return 0;
}
提出情報
| 提出日時 |
|
| 問題 |
D - Merge Triplets |
| ユーザ |
idxcalcal |
| 言語 |
C++14 (GCC 5.4.1) |
| 得点 |
1200 |
| コード長 |
2498 Byte |
| 結果 |
AC |
| 実行時間 |
520 ms |
| メモリ |
209792 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
1200 / 1200 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
0_000.txt, 0_001.txt, 0_002.txt |
| All |
0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 0_000.txt |
AC |
1 ms |
256 KiB |
| 0_001.txt |
AC |
1 ms |
256 KiB |
| 0_002.txt |
AC |
20 ms |
33280 KiB |
| 1_003.txt |
AC |
1 ms |
256 KiB |
| 1_004.txt |
AC |
5 ms |
10752 KiB |
| 1_005.txt |
AC |
142 ms |
104960 KiB |
| 1_006.txt |
AC |
4 ms |
8704 KiB |
| 1_007.txt |
AC |
117 ms |
94720 KiB |
| 1_008.txt |
AC |
37 ms |
47616 KiB |
| 1_009.txt |
AC |
513 ms |
209408 KiB |
| 1_010.txt |
AC |
519 ms |
209664 KiB |
| 1_011.txt |
AC |
520 ms |
209792 KiB |
| 1_012.txt |
AC |
520 ms |
209792 KiB |
| 1_013.txt |
AC |
520 ms |
209792 KiB |
| 1_014.txt |
AC |
519 ms |
209664 KiB |