提出 #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
結果
AC × 3
AC × 15
セット名 テストケース
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