Submission #2487505


Source Code Expand

#include <bits/stdc++.h>

using namespace std;

template< unsigned mod, unsigned primitiveroot >
struct NumberTheoreticTransform {

  vector< vector< unsigned > > rts, rrts;

  void ensure_base(unsigned N) {
    if(rts.size() >= N) return;
    rts.resize(N), rrts.resize(N);
    for(unsigned i = 1; i < N; i <<= 1) {
      if(rts[i].size()) continue;
      unsigned w = mod_pow(primitiveroot, (mod - 1) / (i * 2));
      unsigned rw = inverse(w);
      rts[i].resize(i), rrts[i].resize(i);
      rts[i][0] = 1, rrts[i][0] = 1;
      for(int k = 1; k < i; k++) {
        rts[i][k] = mul(rts[i][k - 1], w);
        rrts[i][k] = mul(rrts[i][k - 1], rw);
      }
    }
  }

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

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

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

  inline unsigned mul(unsigned a, unsigned b) {
    return unsigned(1LL * a * b % mod);
  }

  void DiscreteFourierTransform(vector< unsigned > &F, bool rev) {
    const unsigned N = (int) F.size();
    ensure_base(N);
    for(unsigned i = 0, j = 1; j + 1 < N; j++) {
      for(unsigned k = N >> 1; k > (i ^= k); k >>= 1);
      if(i > j) swap(F[i], F[j]);
    }
    for(int i = 1; i < N; i <<= 1) {
      for(int j = 0; j < N; j += i * 2) {
        for(int k = 0; k < i; k++) {
          unsigned s = F[j + k], t = mul(F[j + k + i], rev ? rrts[i][k] : rts[i][k]);
          F[j + k] = add(s, t), F[j + k + i] = add(s, mod - t);
        }
      }
    }
    if(rev) {
      unsigned temp = inverse(N);
      for(int i = 0; i < N; i++) F[i] = mul(F[i], temp);
    }
  }

  vector< unsigned > Multiply(const vector< int > &A, const vector< int > &B) {
    int sz = 1;
    while(sz < A.size() + B.size() - 1) sz <<= 1;
    vector< unsigned > 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);
  }
};

const int mod = 1012924417;
const int primitiveRoot = 5;

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< mod, primitiveRoot > ntt;
  auto C = ntt.Multiply(A, B);
  for(int i = 1; i <= 2 * N; i++) printf("%d\n", C[i]);
}

Submission Info

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

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:91:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &N);
                  ^
./Main.cpp:93: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 1 ms 256 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 1 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 1 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 38 ms 9216 KB
02_01_82431 AC 69 ms 17920 KB
02_02_17056 AC 17 ms 4608 KB
02_03_34866 AC 33 ms 8960 KB
02_04_6779 AC 6 ms 1536 KB
02_05_65534 AC 43 ms 9720 KB
02_06_65535 AC 43 ms 9720 KB
02_07_65536 AC 64 ms 17664 KB
02_08_65537 AC 64 ms 17664 KB
02_09_65538 AC 64 ms 17664 KB
02_10_100000 AC 75 ms 18176 KB