Submission #69187129


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/convolution>
using namespace std;
using namespace atcoder;

int mod = 998244353;

// (a^p)%mod の long long 内計算(法<2^31.5に限る)
long long power_mod(long long a, long long p) {
  if (p==0) return 1LL;
  if (p&1LL) {
    return (power_mod(a,p-1)*a)%mod;
  } else {
    long long tmp = power_mod(a,p>>1);
    return tmp*tmp%mod;
  }
}

// mod上での逆数計算(法<2^31.5に限る)
long long inverse(long long a) {
  return power_mod(a,mod-2);
}

/////////////////// メイン ///////////////////

int main () {
  
  //////////////////// 入力 ////////////////////

  int n, a, b, c;
  cin >> n >> a >> b >> c;

  int mod = 998244353;

  //////////////// 出力変数定義 ////////////////

  int result1, result2;

  //////////////////// 処理 ////////////////////

  // n!までの階乗を用意
  vector<long long> factorial(n+1,0);
  factorial.at(0) = 1;
  for (int i=1; i<=n; i++) {
    factorial.at(i) = factorial.at(i-1)*i%mod;
  }

  // 形式的べき級数用のvector
  vector<int> pa(n+1,0);
  vector<int> pb(n+1,0);
  vector<int> pc(n+1,0);

  // それぞれの箱の中で条件を満たす入れ方を数える
  for (int i=0; i<=n; i+=a) {
    pa.at(i) = 1;
  }
  for (int i=0; i<=n; i+=b) {
    pb.at(i) = 1;
  }
  for (int i=0; i<=n; i+=c) {
    pc.at(i) = 1;
  }

  // 3つを畳み込んで、n次の係数が答え
  vector<int> tmp1 = convolution<998244353>(pa,pb);
  tmp1.resize(n+1);
  vector<int> p1 = convolution<998244353>(tmp1,pc);
  p1.resize(n+1);
  result1 = p1.at(n);

  // n!/(na!*nb!*nc!)をかけたいので、畳み込む前に個数の階乗で割った状態を作る
  for (int i=0; i<=n; i+=a) {
    pa.at(i) *= inverse(factorial.at(i));
  }
  for (int i=0; i<=n; i+=b) {
    pb.at(i) *= inverse(factorial.at(i));
  }
  for (int i=0; i<=n; i+=c) {
    pc.at(i) *= inverse(factorial.at(i));
  }

  // 3つを畳み込んで、n次の係数にn!をかけたものが答え
  vector<int> tmp2 = convolution<998244353>(pa,pb);
  tmp2.resize(n+1);
  vector<int> p2 = convolution<998244353>(tmp2,pc);
  p2.resize(n+1);
  result2 = p2.at(n)*factorial.at(n)%mod;

  //////////////////// 出力 ////////////////////

  cout << result1 << endl;
  cout << result2 << endl;

  //////////////////// 終了 ////////////////////

  return 0;

}

Submission Info

Submission Time
Task G - Balls and Boxes
User wightou
Language C++ 23 (gcc 12.2)
Score 575
Code Size 2435 Byte
Status AC
Exec Time 596 ms
Memory 29124 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 575 / 575
Status
AC × 4
AC × 32
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt, 02_corner_03.txt, 02_corner_04.txt, 02_corner_05.txt, 02_corner_06.txt, 02_corner_07.txt, 02_corner_08.txt, 02_corner_09.txt, 02_corner_10.txt, 02_corner_11.txt, 02_corner_12.txt, 02_corner_13.txt, 02_corner_14.txt, 02_corner_15.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3552 KiB
00_sample_01.txt AC 2 ms 3568 KiB
00_sample_02.txt AC 233 ms 28960 KiB
00_sample_03.txt AC 7 ms 4012 KiB
01_random_00.txt AC 146 ms 21892 KiB
01_random_01.txt AC 367 ms 28960 KiB
01_random_02.txt AC 123 ms 16388 KiB
01_random_03.txt AC 309 ms 29024 KiB
01_random_04.txt AC 111 ms 20192 KiB
01_random_05.txt AC 211 ms 29048 KiB
01_random_06.txt AC 107 ms 16608 KiB
01_random_07.txt AC 213 ms 28964 KiB
01_random_08.txt AC 106 ms 16476 KiB
01_random_09.txt AC 211 ms 29012 KiB
01_random_10.txt AC 108 ms 17868 KiB
01_random_11.txt AC 210 ms 29020 KiB
02_corner_00.txt AC 596 ms 28912 KiB
02_corner_01.txt AC 596 ms 28972 KiB
02_corner_02.txt AC 447 ms 28960 KiB
02_corner_03.txt AC 446 ms 28884 KiB
02_corner_04.txt AC 350 ms 28820 KiB
02_corner_05.txt AC 351 ms 28952 KiB
02_corner_06.txt AC 298 ms 29044 KiB
02_corner_07.txt AC 298 ms 29124 KiB
02_corner_08.txt AC 255 ms 28912 KiB
02_corner_09.txt AC 254 ms 28852 KiB
02_corner_10.txt AC 210 ms 28916 KiB
02_corner_11.txt AC 211 ms 29004 KiB
02_corner_12.txt AC 211 ms 28876 KiB
02_corner_13.txt AC 211 ms 28936 KiB
02_corner_14.txt AC 124 ms 17840 KiB
02_corner_15.txt AC 127 ms 21748 KiB