Untitled
unknown
c_cpp
3 months ago
3.0 kB
42
Indexable
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast, unroll-loops")
#ifdef ONLINE_JUDGE
#define debug(...) ((void)0)
#else
#include "debug.h"
#endif
using namespace std;
using ll = long long;
#define endl '\n'
vector<int> lp, primes;
void compute_primes(int N){
lp = vector<int>(N);
lp[1] = 1;
for(int i = 2; i < N; i++){
if(!lp[i]){
lp[i] = i;
primes.push_back(i);
}
for(int p : primes){
ll x = i * 1LL * p;
if(x >= N) break;
lp[x] = p;
if(p == lp[i]) break;
}
}
}
template<typename T>
void SubsetZetaTransform(vector<T>& v) {
const int n = v.size();
for (int j = 1; j < n; j <<= 1) {
for (int i = 0; i < n; i++) if (i & j) v[i] += v[i ^ j];
}
}
template<typename T>
void SubsetMobiusTransform(vector<T>& v) {
const int n = v.size();
for (int j = 1; j < n; j <<= 1) {
for (int i = 0; i < n; i++) if (i & j) v[i] -= v[i ^ j];
}
}
template<typename T>
void SupersetZetaTransform(vector<T>& v) {
const int n = v.size(); // n must be a power of 2
for (int j = 1; j < n; j <<= 1) {
for (int i = 0; i < n; i++) if (i & j) v[i ^ j] += v[i];
}
}
template<typename T>
void SupersetMobiusTransform(vector<T>& v) {
const int n = v.size(); // n must be a power of 2
for (int j = 1; j < n; j <<= 1) {
for (int i = 0; i < n; i++) if (i & j) v[i ^ j] -= v[i];
}
}
template<typename T>
void DivisorZetaTransform(vector<T>& v) {
const int n = (int)v.size() - 1;
for (int p : primes) {
if(p > n) break;
for (int i = 1; i * p <= n; i++) v[i * p] += v[i];
}
}
template<typename T>
void DivisorMobiusTransform(vector<T>& v) {
const int n = (int)v.size() - 1;
for (int p : primes) {
if(p > n) break;
for (int i = n / p; i; i--) v[i * p] -= v[i];
}
}
template<typename T>
void MultipleZetaTransform(vector<T>& v) {
const int n = (int)v.size() - 1;
for (int p : primes) {
if(p > n) break;
for (int i = n / p; i; i--) v[i] += v[i * p];
}
}
template<typename T>
void MultipleMobiusTransform(vector<T>& v) {
const int n = (int)v.size() - 1;
for (int p : primes) {
if(p > n) break;
for (int i = 1; i * p <= n; i++) v[i] -= v[i * p];
}
}
template<typename T>
vector<T> GCDConvolution(vector<T> A, vector<T> B) {
MultipleZetaTransform(A);
MultipleZetaTransform(B);
for (int i = 0; i < A.size(); i++) A[i] *= B[i];
MultipleMobiusTransform(A);
return A;
}
template<typename T>
vector<T> LCMConvolution(vector<T> A, vector<T> B) {
DivisorZetaTransform(A);
DivisorZetaTransform(B);
for (int i = 0; i < A.size(); i++) A[i] *= B[i];
DivisorMobiusTransform(A);
return A;
}
const int LOG = 22, N = (1 << LOG);
void SOLVE() {
}
signed main(){
ios_base::sync_with_stdio(false); cin.tie(nullptr);
compute_primes(N);
int o_o; cin >> o_o; while(o_o--)
SOLVE(); return 0;
}Editor is loading...
Leave a Comment