Untitled

 avatar
unknown
c_cpp
3 months ago
3.0 kB
34
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