Skip to content

Commit 0ce70c0

Browse files
chore: update minified library versions
1 parent 4e64432 commit 0ce70c0

File tree

3 files changed

+4
-4
lines changed

3 files changed

+4
-4
lines changed

cp-algo/min/math/multivar.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
#include "../math/fft.hpp"
66
#pragma GCC push_options
77
#pragma GCC target("avx2")
8-
namespace cp_algo::math::fft{template<modint_type base>struct multivar{big_vector<base>data;big_vector<size_t>ranks;big_vector<size_t>dim;size_t N;size_t rank(size_t i){size_t cur=1,res=0,K=size(dim);for(auto ni:dim){cur*=ni;res+=i/cur;}return res%K;}multivar(auto const&dim):dim(begin(dim),end(dim)),N(std::ranges::fold_left(dim,1,std::multiplies{})){data.resize(N);ranks.resize(N);for(auto[i,x]:ranks|std::views::enumerate){x=rank(i);}checkpoint("multivar init");}void read(){for(auto&it:data){std::cin>>it;}checkpoint("multivar read");}void print(){for(auto&it:data){std::cout<<it<<" ";}std::cout<<"\n";checkpoint("multivar write");}void mul(multivar<base>const&b){assert(dim==b.dim);size_t K=size(dim);if(K==0){data[0]*=b.data[0];return;}big_vector<dft<base>>A,B;size_t M=std::max(flen,std::bit_ceil(2*N-1)/2);for(size_t i=0;i<K;i++){A.emplace_back(data|std::views::enumerate|std::views::transform([&](auto jx)__attribute__((always_inline)){auto[j,x]=jx;return ranks[j]==i?x:base(0);}),M,false);B.emplace_back(b.data|std::views::enumerate|std::views::transform([&](auto jx)__attribute__((always_inline)){auto[j,x]=jx;return ranks[j]==i?x:base(0);}),M,false);}for(size_t i=0;i<K;i++){dft<base>C(M);cvector X=C.A;for(size_t j=0;j<K;j++){size_t tj=(i-j+K)%K;A[j].template dot<false,false>(B[tj].A,B[tj].B,C.A,C.B,X);}checkpoint("dot");big_vector<base>res((N+flen-1)/flen*flen);C.A.template ifft<false>();C.B.template ifft<false>();X.template ifft<false>();C.recover_mod(X,res,N);for(size_t j=0;j<N;j++){if(i==ranks[j]){data[j]=res[j];}}checkpoint("store");}}};}
8+
namespace cp_algo::math::fft{template<modint_type base>struct multivar{big_vector<base>data;big_vector<size_t>ranks;big_vector<size_t>dim;size_t N;size_t rank(size_t i){size_t cur=1,res=0,K=size(dim);for(auto ni:dim){cur*=ni;res+=i/cur;}return res%K;}multivar(auto const&dim):dim(begin(dim),end(dim)),N(std::ranges::fold_left(dim,1,std::multiplies{})){data.resize(N);ranks.resize(N);for(auto[i,x]:ranks|std::views::enumerate){x=rank(i);}checkpoint("multivar init");}void read(){for(auto&it:data){std::cin>>it;}checkpoint("multivar read");}void print(){for(auto&it:data){std::cout<<it<<" ";}std::cout<<"\n";checkpoint("multivar write");}void mul(multivar<base>const&b){assert(dim==b.dim);size_t K=size(dim);if(K==0){data[0]*=b.data[0];return;}big_vector<dft<base>>A,B;size_t M=std::max(flen,std::bit_ceil(2*N-1)/2);for(size_t i=0;i<K;i++){A.emplace_back(data|std::views::enumerate|std::views::transform([&](auto jx){auto[j,x]=jx;return ranks[j]==i?x:base(0);}),M,false);B.emplace_back(b.data|std::views::enumerate|std::views::transform([&](auto jx){auto[j,x]=jx;return ranks[j]==i?x:base(0);}),M,false);}for(size_t i=0;i<K;i++){dft<base>C(M);cvector X=C.A;for(size_t j=0;j<K;j++){size_t tj=(i-j+K)%K;A[j].template dot<false,false>(B[tj].A,B[tj].B,C.A,C.B,X);}checkpoint("dot");big_vector<base>res((N+flen-1)/flen*flen);C.A.template ifft<false>();C.B.template ifft<false>();X.template ifft<false>();C.recover_mod(X,res,N);for(size_t j=0;j<N;j++){if(i==ranks[j]){data[j]=res[j];}}checkpoint("store");}}};}
99
#pragma GCC pop_options
1010
#endif

cp-algo/min/util/bit.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@
44
#include <cstdint>
55
#include <array>
66
#include <bit>
7+
#pragma GCC push_options
8+
#pragma GCC target("avx2")
79
namespace cp_algo{template<typename Uint>constexpr size_t bit_width=sizeof(Uint)*8;uint64_t mask(size_t n){return(1ULL<<n)-1;}size_t order_of_bit(auto x,size_t k){return k?std::popcount(x<<(bit_width<decltype(x)>-k)):0;}[[gnu::target("bmi2")]]inline size_t kth_set_bit(uint64_t x,size_t k){return std::countr_zero(_pdep_u64(1ULL<<k,x));}template<int fl=0>void with_bit_floor(size_t n,auto&&callback){if constexpr(fl>=63){return;}else if(n>>(fl+1)){with_bit_floor<fl+1>(n,callback);}else{callback.template operator()<1ULL<<fl>();}}void with_bit_ceil(size_t n,auto&&callback){with_bit_floor(n,[&]<size_t N>(){if(N==n){callback.template operator()<N>();}else{callback.template operator()<N<<1>();}});}inline uint32_t read_bits(char const*p){return _mm256_movemask_epi8(__m256i(vector_cast<u8x32 const>(p[0])+(127-'0')));}inline uint64_t read_bits64(char const*p){return read_bits(p)|(uint64_t(read_bits(p+32))<<32);}inline void write_bits(char*p,uint32_t bits){static constexpr u8x32 shuffler={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3};auto shuffled=u8x32(_mm256_shuffle_epi8(__m256i()+bits,__m256i(shuffler)));static constexpr u8x32 mask={1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128};for(int z=0;z<32;z++){p[z]=shuffled[z]&mask[z]?'1':'0';}}inline void write_bits64(char*p,uint64_t bits){write_bits(p,uint32_t(bits));write_bits(p+32,uint32_t(bits>>32));}}
10+
#pragma GCC pop_options
811
#endif

cp-algo/min/util/simd.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
#ifndef CP_ALGO_UTIL_SIMD_HPP
22
#define CP_ALGO_UTIL_SIMD_HPP
3-
#define _GLIBCXX_USE_DEPRECATED 0
4-
#pragma GCC push_options
5-
#pragma GCC target("avx2")
63
#include <experimental/simd>
74
#include <cstdint>
85
#include <cstddef>

0 commit comments

Comments
 (0)