cp-book

ecnerwala's competitive programming library

View the Project on GitHub ecnerwala/cp-book

:heavy_check_mark: #include "nim_prod.hpp"

View this file on GitHub · Last update: 2021-02-27 11:43:12-08:00

Verified with

Code

Coverage Exec / Excl / Total
Lines 33.3% 5 / 0 / 15
Functions 50.0% 1 / 0 / 2
Branches 50.0% 9 / 0 / 18
Full report
#pragma once

#include <utility>
#include <cstdint>

// Usage:
//   constexpr nim_prod_t nimProd;
// C++20:
//   constinit nim_prod_t nimProd;
struct nim_prod_t {
	uint64_t bit_prod[64][64]{};
	constexpr nim_prod_t() {
		for (int i = 0; i < 64; i++) {
			for (int j = 0; j < 64; j++) {
				if ((i & j) == 0) {
					bit_prod[i][j] = uint64_t(1) << (i|j);
				} else {
					int a = (i&j) & -(i&j);
					bit_prod[i][j] = bit_prod[i ^ a][j] ^ bit_prod[(i ^ a) | (a-1)][(j ^ a) | (i & (a-1))];
				}
			}
		}
	}
	constexpr uint64_t operator () (uint64_t x, uint64_t y) const {
		uint64_t res = 0;
		for (int i = 0; i < 64 && (x >> i); i++)
			if ((x >> i) & 1)
				for (int j = 0; j < 64 && (y >> j); j++)
					if ((y >> j) & 1)
						res ^= bit_prod[i][j];
		return res;
	}
};
#include <utility>
#include <cstdint>
#line 2 "src/nim_prod.hpp"

#line 5 "src/nim_prod.hpp"

// Usage:
//   constexpr nim_prod_t nimProd;
// C++20:
//   constinit nim_prod_t nimProd;
struct nim_prod_t {
	uint64_t bit_prod[64][64]{};
	constexpr nim_prod_t() {
		for (int i = 0; i < 64; i++) {
			for (int j = 0; j < 64; j++) {
				if ((i & j) == 0) {
					bit_prod[i][j] = uint64_t(1) << (i|j);
				} else {
					int a = (i&j) & -(i&j);
					bit_prod[i][j] = bit_prod[i ^ a][j] ^ bit_prod[(i ^ a) | (a-1)][(j ^ a) | (i & (a-1))];
				}
			}
		}
	}
	constexpr uint64_t operator () (uint64_t x, uint64_t y) const {
		uint64_t res = 0;
		for (int i = 0; i < 64 && (x >> i); i++)
			if ((x >> i) & 1)
				for (int j = 0; j < 64 && (y >> j); j++)
					if ((y >> j) & 1)
						res ^= bit_prod[i][j];
		return res;
	}
};
// clang-format off
// @formatter:off
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpragmas"
#pragma GCC diagnostic ignored "-Wunknown-warning-option"
#pragma GCC diagnostic ignored "-Wmisleading-indentation"
#pragma GCC diagnostic ignored "-Wmultistatement-macros"
#include <bits/stdc++.h>
// src/nim_prod.hpp
struct nim_prod_t{
uint64_t bit_prod[64][64]{};
constexpr nim_prod_t(){
for(int i=0;i<64;i++){
for(int j=0;j<64;j++){
if((i&j)==0){
bit_prod[i][j]=uint64_t(1)<<(i|j);
}else{
int a=(i&j)&-(i&j);
bit_prod[i][j]=bit_prod[i^a][j]^bit_prod[(i^a)|(a-1)][(j^a)|(i&(a-1))];
}
}
}
}
constexpr uint64_t operator()(uint64_t x,uint64_t y)const{
uint64_t res=0;
for(int i=0;i<64&&(x>>i);i++)
if((x>>i)&1)
for(int j=0;j<64&&(y>>j);j++)
if((y>>j)&1)
res^=bit_prod[i][j];
return res;
}
};
#pragma GCC diagnostic pop
// clang-format on
// @formatter:on
#pragma once

#include <utility>
#include <cstdint>

// Usage:
//   constexpr nim_prod_t nimProd;
// C++20:
//   constinit nim_prod_t nimProd;
struct nim_prod_t {
	uint64_t bit_prod[64][64]{};
	constexpr nim_prod_t() {
		for (int i = 0; i < 64; i++) {
			for (int j = 0; j < 64; j++) {
				if ((i & j) == 0) {
					bit_prod[i][j] = uint64_t(1) << (i|j);
				} else {
					int a = (i&j) & -(i&j);
					bit_prod[i][j] = bit_prod[i ^ a][j] ^ bit_prod[(i ^ a) | (a-1)][(j ^ a) | (i & (a-1))];
				}
			}
		}
	}
	constexpr uint64_t operator () (uint64_t x, uint64_t y) const {
		uint64_t res = 0;
		for (int i = 0; i < 64 && (x >> i); i++)
			if ((x >> i) & 1)
				for (int j = 0; j < 64 && (y >> j); j++)
					if ((y >> j) & 1)
						res ^= bit_prod[i][j];
		return res;
	}
};
Back to top page