Submission #6907675
Source Code Expand
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.*;
import java.math.BigInteger;
public class Main implements Runnable {
//static int mod = 1000000007;
public static void main(String[] args) {
new Thread(null, new Main(), "", 1024 * 1024 * 1024).start();
}
public void run() {
PrintWriter out = new PrintWriter(System.out);
FastScanner sc = new FastScanner();
int n = sc.nextInt();
long[] a = new long[n];
long[] b = new long[n];
for(int i=0;i<n;i++){
a[i] = sc.nextLong();
b[i] = sc.nextLong();
}
long[] ans = FastFourierTransform.multiply(a, b);
out.println(0);
for(int i=0;i<ans.length;i++){
out.println(Math.round(ans[i]));
}
out.flush();
}
static void test(int[] a){
for(int i=0;i<a.length-1;i++){
System.out.print(a[i]);
System.out.print(" ");
}
System.out.println(a[a.length-1]);
}
static void test(double[] a){
for(int i=0;i<a.length-1;i++){
System.out.print(a[i]);
System.out.print(" ");
}
System.out.println(a[a.length-1]);
}
}
class FastFourierTransform {
static Complex[] dft(Complex[] f, int n){
Complex[] nf = new Complex[n];
for(int i=0;i<f.length;i++){
nf[i] = f[i];
}
for(int i=f.length;i<n;i++){
nf[i] = new Complex(0,0);
}
fft(nf,false);
return nf;
}
static Complex[] invdft(Complex[] f, int n){
Complex[] nf = new Complex[n];
for(int i=0;i<f.length;i++){
nf[i] = f[i];
}
for(int i=f.length;i<n;i++){
nf[i] = new Complex(0,0);
}
fft(nf,true);
return nf;
}
static Complex[] multiply(Complex[] g, Complex[] h){
int n = up2Pow(g.length + h.length + 1);
Complex[] gg = dft(g,n);
Complex[] hh = dft(h,n);
Complex[] ff = new Complex[n];
for(int i=0;i<n;i++){
ff[i] = gg[i].multiply(hh[i]);
}
return invdft(ff,n);
}
static long[] multiply(long[] a, long[] b){
Complex[] x = new Complex[a.length];
Complex[] y = new Complex[b.length];
for(int i=0;i<a.length;i++){
x[i] = new Complex(a[i],0);
}
for(int i=0;i<b.length;i++){
y[i] = new Complex(b[i],0);
}
Complex[] tmp = FastFourierTransform.multiply(x, y);
long[] ans = new long[a.length + b.length - 1];
for(int i=0;i<a.length + b.length - 1;i++){
ans[i] = Math.round(tmp[i].real);
}
return ans;
}
static void fft(Complex[] f, boolean inv){
int n = f.length; //2冪
//添字のバタフライ
for(int i=1,j=0; i<n; i++){
int m = n>>1;
for(; j>=m; m>>=1){
j -= m;
}
j+=m;
if(i<j){
Complex tmp = new Complex(f[i].real, f[i].img);
f[i] = f[j];
f[j] = tmp;
}
}
for(int len = 2;len<=n; len <<= 1){
System.gc();
int h = len>>1;
double theta = 2*Math.PI / len;
if(inv){
theta = -theta;
}
Complex z = new Complex(Math.cos(theta), Math.sin(theta));
for(int i=0;i<n;i+=len){
Complex w = new Complex(1,0);
for(int j=0;j<h;j++){
Complex u = new Complex(f[i+j].real,f[i+j].img);
Complex v = w.multiply(f[i+j+h]);
f[i+j] = u.plus(v);
f[i+j+h] = u.minus(v);
w = w.multiply(z);
}
}
}
if(inv){
for(int i=0;i<n;i++){
f[i] = f[i].divide(n);
}
}
}
//n以上の最小の2ベキ
static int up2Pow(int n){
if(n <= 0){
return 0;
}
if ((n&(n-1)) == 0){ //このときはn自身が2ベキ
return n;
}
int ret = 1;
while(n > 0){
ret<<=1;
n>>=1;
}
return ret;
}
}
class Complex {
double real;
double img;
public Complex(double real, double img){
this.real = real;
this.img = img;
}
Complex plus(Complex y){
return new Complex(this.real+y.real, this.img+y.img);
}
Complex minus(Complex y){
return new Complex(this.real - y.real, this.img - y.img);
}
Complex multiply(Complex y){
return new Complex(this.real*y.real - this.img*y.img, this.real*y.img + this.img*y.real);
}
//共役
Complex conjugate(){
return new Complex(this.real, -this.img);
}
Complex divide(double y){
return new Complex(this.real/y, this.img/y);
}
}
class FastScanner {
private final InputStream in = System.in;
private final byte[] buffer = new byte[1024];
private int ptr = 0;
private int buflen = 0;
private boolean hasNextByte() {
if (ptr < buflen) {
return true;
} else {
ptr = 0;
try {
buflen = in.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
if (buflen <= 0) {
return false;
}
}
return true;
}
private int readByte() {
if (hasNextByte())
return buffer[ptr++];
else
return -1;
}
private static boolean isPrintableChar(int c) {
return 33 <= c && c <= 126;
}
public boolean hasNext() {
while (hasNextByte() && !isPrintableChar(buffer[ptr]))
ptr++;
return hasNextByte();
}
public String next() {
if (!hasNext())
throw new NoSuchElementException();
StringBuilder sb = new StringBuilder();
int b = readByte();
while (isPrintableChar(b)) {
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
public long nextLong() {
if (!hasNext())
throw new NoSuchElementException();
long n = 0;
boolean minus = false;
int b = readByte();
if (b == '-') {
minus = true;
b = readByte();
}
if (b < '0' || '9' < b) {
throw new NumberFormatException();
}
while (true) {
if ('0' <= b && b <= '9') {
n *= 10;
n += b - '0';
} else if (b == -1 || !isPrintableChar(b)) {
return minus ? -n : n;
} else {
throw new NumberFormatException();
}
b = readByte();
}
}
public int nextInt() {
long nl = nextLong();
if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
throw new NumberFormatException();
return (int) nl;
}
public int[] nextintArray(int n){
int[] a = new int[n];
for(int i=0;i<n;i++){
a[i] = nextInt();
}
return a;
}
public long[] nextlongArray(int n){
long[] a = new long[n];
for(int i=0;i<n;i++){
a[i] = nextLong();
}
return a;
}
public Integer[] nextIntegerArray(int n){
Integer[] a = new Integer[n];
for(int i=0;i<n;i++){
a[i] = nextInt();
}
return a;
}
public int[][] nextintMatrix(int h, int w){
int[][] mat = new int[h][w];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
mat[i][j] = nextInt();
}
}
return mat;
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
Submission Info
Submission Time |
|
Task |
C - 高速フーリエ変換 |
User |
warachia |
Language |
Java8 (OpenJDK 1.8.0) |
Score |
0 |
Code Size |
6991 Byte |
Status |
TLE |
Exec Time |
5261 ms |
Memory |
118244 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
0 / 100 |
Status |
|
|
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 |
110 ms |
37204 KB |
01_00_01 |
AC |
94 ms |
33108 KB |
01_01_19 |
AC |
130 ms |
36564 KB |
01_02_31 |
AC |
131 ms |
35540 KB |
01_03_22 |
AC |
132 ms |
37972 KB |
01_04_31 |
AC |
134 ms |
35668 KB |
01_05_40 |
AC |
140 ms |
34388 KB |
01_06_15 |
AC |
118 ms |
35924 KB |
01_07_39 |
AC |
141 ms |
34516 KB |
01_08_28 |
AC |
128 ms |
34004 KB |
01_09_30 |
AC |
128 ms |
36308 KB |
01_10_23 |
AC |
135 ms |
35412 KB |
01_11_33 |
AC |
141 ms |
37204 KB |
01_12_11 |
AC |
122 ms |
35924 KB |
01_13_28 |
AC |
129 ms |
35796 KB |
01_14_41 |
AC |
142 ms |
35540 KB |
01_15_26 |
AC |
131 ms |
37712 KB |
01_16_49 |
AC |
142 ms |
38356 KB |
01_17_34 |
AC |
139 ms |
37844 KB |
01_18_02 |
AC |
102 ms |
35796 KB |
01_19_33 |
AC |
143 ms |
37840 KB |
01_20_29 |
AC |
130 ms |
37972 KB |
02_00_51254 |
AC |
3468 ms |
81372 KB |
02_01_82431 |
TLE |
5261 ms |
109220 KB |
02_02_17056 |
AC |
1777 ms |
55824 KB |
02_03_34866 |
AC |
3397 ms |
72860 KB |
02_04_6779 |
AC |
616 ms |
45552 KB |
02_05_65534 |
AC |
3681 ms |
78260 KB |
02_06_65535 |
AC |
3678 ms |
78644 KB |
02_07_65536 |
TLE |
5261 ms |
115408 KB |
02_08_65537 |
TLE |
5261 ms |
110472 KB |
02_09_65538 |
TLE |
5261 ms |
113636 KB |
02_10_100000 |
TLE |
5261 ms |
118244 KB |