Submission #1779261


Source Code Expand

#include<bits/stdc++.h>

using namespace std;

using int64 = long long;

struct NumberTheoreticTransform
{
  int64 mod;
  int64 primitiveroot;

  NumberTheoreticTransform(int64 mod, int64 root) : mod(mod), primitiveroot(root) {}

  inline int64 mod_pow(int64 x, int64 n)
  {
    int64 ret = 1;
    while(n > 0) {
      if(n & 1) ret = mul(ret, x);
      x = mul(x, x);
      n >>= 1;
    }
    return ret;
  }

  inline int64 inverse(int64 x)
  {
    return (mod_pow(x, mod - 2));
  }

  inline int64 add(int64 x, int64 y)
  {
    x += y;
    if(x >= mod) x -= mod;
    return (x);
  }

  inline int64 mul(__int128 a, int64 b)
  {
    return (a * b % mod);
  }

  void DiscreteFourierTransform(vector< int64 > &F, bool rev)
  {
    const int N = (int) F.size();
    for(int i = 0, j = 1; j + 1 < N; j++) {
      for(int k = N >> 1; k > (i ^= k); k >>= 1);
      if(i > j) swap(F[i], F[j]);
    }
    int64 w, wn, s, t;
    for(int i = 1; i < N; i <<= 1) {
      w = mod_pow(primitiveroot, (mod - 1) / (i * 2));
      if(rev) w = inverse(w);
      for(int k = 0; k < i; k++) {
        wn = mod_pow(w, k);
        for(int j = 0; j < N; j += i * 2) {
          s = F[j + k], t = mul(F[j + k + i], wn);
          F[j + k] = add(s, t), F[j + k + i] = add(s, mod - t);
        }
      }
    }
    if(rev) {
      int64 temp = inverse(N);
      for(int i = 0; i < N; i++) F[i] = mul(F[i], temp);
    }
  }

  vector< int64 > Multiply(const vector< int > &A, const vector< int > &B)
  {
    int sz = 1;
    while(sz < A.size() + B.size() - 1) sz <<= 1;
    vector< int64 > F(sz), G(sz);
    for(int i = 0; i < A.size(); i++) F[i] = A[i];
    for(int i = 0; i < B.size(); i++) G[i] = B[i];
    DiscreteFourierTransform(F, false);
    DiscreteFourierTransform(G, false);
    for(int i = 0; i < sz; i++) F[i] = mul(F[i], G[i]);
    DiscreteFourierTransform(F, true);
    F.resize(A.size() + B.size() - 1);
    return (F);
  }
};

int main()
{
  int N;
  scanf("%d", &N);
  vector< int > A(N + 1), B(N + 1);
  for(int i = 0; i < N; i++) scanf("%d %d", &A[i + 1], &B[i + 1]);
  NumberTheoreticTransform ntt(4179340454199820289, 3);
  auto C = ntt.Multiply(A, B);
  for(int i = 1; i <= 2 * N; i++) printf("%lld\n", C[i]);
}

Submission Info

Submission Time
Task C - 高速フーリエ変換
User ei13333
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2300 Byte
Status AC
Exec Time 959 ms
Memory 5120 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:86:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &N);
                  ^
./Main.cpp:88:66: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   for(int i = 0; i < N; i++) scanf("%d %d", &A[i + 1], &B[i + 1]);
                                                                  ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 33
Set Name Test Cases
Sample 00_sample_01
All 00_sample_01, 01_00_01, 01_01_19, 01_02_31, 01_03_22, 01_04_31, 01_05_40, 01_06_15, 01_07_39, 01_08_28, 01_09_30, 01_10_23, 01_11_33, 01_12_11, 01_13_28, 01_14_41, 01_15_26, 01_16_49, 01_17_34, 01_18_02, 01_19_33, 01_20_29, 02_00_51254, 02_01_82431, 02_02_17056, 02_03_34866, 02_04_6779, 02_05_65534, 02_06_65535, 02_07_65536, 02_08_65537, 02_09_65538, 02_10_100000
Case Name Status Exec Time Memory
00_sample_01 AC 3 ms 384 KB
01_00_01 AC 1 ms 256 KB
01_01_19 AC 1 ms 256 KB
01_02_31 AC 1 ms 256 KB
01_03_22 AC 1 ms 256 KB
01_04_31 AC 1 ms 256 KB
01_05_40 AC 2 ms 256 KB
01_06_15 AC 1 ms 256 KB
01_07_39 AC 1 ms 256 KB
01_08_28 AC 1 ms 256 KB
01_09_30 AC 1 ms 256 KB
01_10_23 AC 1 ms 256 KB
01_11_33 AC 1 ms 256 KB
01_12_11 AC 1 ms 256 KB
01_13_28 AC 1 ms 256 KB
01_14_41 AC 1 ms 256 KB
01_15_26 AC 1 ms 256 KB
01_16_49 AC 2 ms 256 KB
01_17_34 AC 1 ms 256 KB
01_18_02 AC 1 ms 256 KB
01_19_33 AC 1 ms 256 KB
01_20_29 AC 1 ms 256 KB
02_00_51254 AC 451 ms 2688 KB
02_01_82431 AC 953 ms 4992 KB
02_02_17056 AC 207 ms 1408 KB
02_03_34866 AC 445 ms 2560 KB
02_04_6779 AC 45 ms 512 KB
02_05_65534 AC 457 ms 2940 KB
02_06_65535 AC 459 ms 2940 KB
02_07_65536 AC 951 ms 4864 KB
02_08_65537 AC 944 ms 4864 KB
02_09_65538 AC 945 ms 4864 KB
02_10_100000 AC 959 ms 5120 KB