FFT/NTT(板子整理)

C++算法模板库实战指南:从线段树到2-SAT的代码复用与工程化 在C++工程实践与算法竞赛中,数据结构与算法模板的合理复用能显著提升开发效率。树状数组、线段树等经典数据结构通常以模板形式封装,但其正确性与性能依赖编译器版本、内存布局及边界处理。本文从模板库的核心构成出发,解析计算几何、多项式、二分图匹配、2-SAT等竞赛常用算法的实现要点,重点讨论如何将离散C++源码集成到VS Code构建环境,涵盖C++17标准配置、命名空间隔离、对拍测试与性能冒烟验证。针对编译报错、下标越界、符号冲突等高频问题,给出可落地的排查思路,帮助读者将通用模板改造为适配自身刷题场景的高效板 阅读详情

思路来源

快速傅里叶变换 & 快速数论变换 - Candy? - 博客园

FTT板子整理

//fft
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=(1<<18)+5, INF=1e9;
const double PI=acos(-1);
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

struct meow{
    double x, y;
    meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;

struct FastFourierTransform {
    int n, rev[N];
    cd omega[N], omegaInv[N];
    void ini(int lim) {
        n=1; int k=0;
        while(n<lim) n<<=1, k++;
        for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));
        
        for(int k=0; k<n; k++) {
            omega[k] = cd(cos(2*PI/n*k), sin(2*PI/n*k));
            omegaInv[k] = conj(omega[k]);
        }
    }
    void fft(cd *a, cd *w) {
        for(int i=0; i<n; i++) if(i<rev[i]) swap(a[i], a[rev[i]]);
        for(int l=2; l<=n; l<<=1) {
            int m=l>>1;
            for(cd *p=a; p!=a+n; p+=l) 
                for(int k=0; k<m; k++) {
                    cd t = w[n/l*k] * p[k+m];
                    p[k+m]=p[k]-t;
                    p[k]=p[k]+t;
                }
        }
    }
    void dft(cd *a, int flag) {
        if(flag==1) fft(a, omega);
        else {
            fft(a, omegaInv);
            for(int i=0; i<n; i++) a[i].x/=n;
        }
    }
    void mul(cd *a, cd *b, int m) {
        ini(m);
        dft(a, 1); dft(b, 1);
        for(int i=0; i<n; i++) a[i]=a[i]*b[i];
        dft(a, -1);
    }
}f;

int n1, n2, m, c[N];
cd a[N], b[N];
char s1[N], s2[N];
int main() {
    //freopen("in","r",stdin);
    scanf("%s%s",s1,s2);
    n1=strlen(s1); n2=strlen(s2);
    for(int i=0; i<n1; i++) a[i].x = s1[n1-i-1]-'0';
    for(int i=0; i<n2; i++) b[i].x = s2[n2-i-1]-'0';
    m=n1+n2-1;
    f.mul(a, b, m);
    for(int i=0; i<m; i++) c[i]=floor(a[i].x+0.5);
    for(int i=0; i<m; i++) c[i+1]+=c[i]/10, c[i]%=10;
    if(c[m]) m++;
    for(int i=m-1; i>=0; i--) printf("%d",c[i]);
}

NTT板子整理

什么,都0202年了你的ntt的wn还要现求,快换一个不用现求的板子吧

以hdu6900为例,Z是模数类,本题是一道分治/启发式NTT的经典题目

Q:为什么998244353(7*17*2^23+1)模数下N最大为2^23?

A:

 原根也符合复数域的单位原根的性质,

但区别在于,fft可以不断细分,因为复数无穷,而ntt的原根不能再细分,

好比说,最后递归长度=2,但是我只剩了一个点值,

求不出这个原函数,dft和idft就不可逆了,即失真

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned ll
const int N = 1<<18, P = 998244353;
const int Primitive_root = 3;//先用Get_root求出来原根然后当const用 
struct Z{
    int x;
    Z(const int _x=0):x(_x){}
    Z operator +(const Z &r)const{ return x+r.x<P?x+r.x:x+r.x-P;}
    Z operator -(const Z &r)const{ return x<r.x?x-r.x+P:x-r.x;}
    Z operator -()const{ return x?P-x:0;}
    Z operator *(const Z &r)const{ return static_cast<ull>(x)*r.x%P;}
    Z operator +=(const Z &r){ return x=x+r.x<P?x+r.x:x+r.x-P, *this;}
    Z operator -=(const Z &r){ return x=x<r.x?x-r.x+P:x-r.x, *this;}
    Z operator *=(const Z &r){ return x=static_cast<ull>(x)*r.x%P, *this;}
    friend Z Pow(Z, int);
    pair<Z,Z> Mul(pair<Z,Z> x, pair<Z,Z> y, Z f)const{
        return make_pair(
            x.first*y.first+x.second*y.second*f,
            x.second*y.first+x.first*y.second
        );
    }
    Z Quadratic_residue()const{
        if(x<=1) return x;
        if(Pow((Z)x, (P-1)/2).x!=1) return -1;
        Z y, f;
        mt19937 rng(20030226);
        do y=rng()%(x-1)+1; while(Pow(f=y*y-x, (P-1)/2).x==1);
        pair<Z,Z> ans=make_pair(1, 0), t=make_pair(y, 1);
        for(int i=(P+1)/2; i; i>>=1, t=Mul(t, t, f)) if(i&1) ans=Mul(ans, t, f);
        return min(ans.first.x, P-ans.first.x);
    }
};
Z Pow(Z x, int y=P-2){
    Z ans=1;
    for(; y; y>>=1, x=x*x) if(y&1) ans=ans*x;
    return ans;
}
namespace Poly{
    Z w[N];
    Z Inv[N];
    vector<Z> ans;
    vector<vector<Z>> p;
    ull F[N];
    int Get_root(){
		static int pr[N],cnt;
		int n=P-1,sz=(int)(sqrt(n)),root=-1;
		for(int i=2;i<=sz;++i){if(n%i==0)pr[cnt++]=i;while(n%i==0)n/=i;}
		if(n>1)pr[cnt++]=n;
		for(int i=1;i<P;++i){
			if(Pow((Z)i,P-1).x==1){
				bool fl=true;
				for(int j=0;j<cnt;++j){
					if(Pow(i,(P-1)/pr[j]).x==1){
						fl=false;break;
					}
				}
				if(fl){root=i;break;}
			}
		}
		return root;
	}
    void Init(){
    	//printf("root:%d\n",Primitive_root=Get_root()); 先求出来原根然后当const用 
        for(int i=1; i<N; i<<=1){
            w[i]=1;
            Z t=Pow((Z)Primitive_root, (P-1)/i/2);
            for(int j=1; j<i; ++j) w[i+j]=w[i+j-1]*t;
        }
        Inv[1]=1;
        for(int i=2; i<N; ++i) Inv[i]=Inv[P%i]*(P-P/i);
    }
    int Get(int x){ int n=1; while(n<=x) n<<=1; return n;}
    int Mod(int x){ return x<P?x:x-P;}
    void DFT(vector<Z> &f, int n){
        if((int)f.size()!=n) f.resize(n);
        for(int i=0, j=0; i<n; ++i){
            F[i]=f[j].x;
            for(int k=n>>1; (j^=k)<k; k>>=1);
        }
        if(n<=4){
            for(int i=1; i<n; i<<=1) for(int j=0; j<n; j+=i<<1){
                Z *W=w+i;
                ull *F0=F+j, *F1=F+j+i;
                for(int k=j; k<j+i; ++k, ++W, ++F0, ++F1){
                    ull t=(*F1)*(W->x)%P;
                    (*F1)=*F0+P-t, (*F0)+=t;
                }
            }
        }
        else{
            for(int j=0; j<n; j+=2){
                int t=F[j+1];
                F[j+1]=Mod(F[j]+P-t), F[j]=Mod(F[j]+t);
            }
            for(int j=0; j<n; j+=4){
                int t0=F[j+2], t1=F[j+3]*w[3].x%P;
                F[j+2]=F[j]+P-t0, F[j]+=t0;
                F[j+3]=F[j+1]+P-t1, F[j+1]+=t1;
            }
            for(int i=4; i<n; i<<=1) for(int j=0; j<n; j+=i<<1){
                Z *W=w+i;
                ull *F0=F+j, *F1=F+j+i;
                for(int k=j; k<j+i; k+=4, W+=4, F0+=4, F1+=4){
                    int t0=(W->x)**F1%P;
                    int t1=(W+1)->x**(F1+1)%P;
                    int t2=(W+2)->x**(F1+2)%P;
                    int t3=(W+3)->x**(F1+3)%P;
                    *F1=*F0+P-t0, *F0+=t0;
                    *(F1+1)=*(F0+1)+P-t1, *(F0+1)+=t1;
                    *(F1+2)=*(F0+2)+P-t2, *(F0+2)+=t2;
                    *(F1+3)=*(F0+3)+P-t3, *(F0+3)+=t3;
                }
            }
        }
        for(int i=0; i<n; ++i) f[i]=F[i]%P;
    }
    void IDFT(vector<Z> &f, int n){
        f.resize(n), reverse(f.begin()+1, f.end()), DFT(f, n);
        Z I=1;
        for(int i=1; i<n; i<<=1) I*=(P+1)/2;
        for(int i=0; i<n; ++i) f[i]*=I;
    }
    vector<Z> operator +(const vector<Z> &f, const vector<Z> &g){
        vector<Z> ans=f;
        ans.resize(max(f.size(), g.size()));
        for(int i=0; i<(int)g.size(); ++i) ans[i]+=g[i];
        return ans;
    }
    vector<Z> operator *(const vector<Z> &f, const vector<Z> &g){
        static vector<Z> F, G;
        F=f, G=g;
        int p=Get(f.size()+g.size()-2);
        DFT(F, p), DFT(G, p);
        for(int i=0; i<p; ++i) F[i]*=G[i];
        IDFT(F, p);
        return F.resize(f.size()+g.size()-1), F;
    }
    vector<Z> operator *(const vector<Z> &f, Z g){
        vector<Z> ans=f;
        for(Z &i:ans) i*=g;
        return ans;
    }
}
using namespace Poly;
int T,n,b[N],c[N];
Z fac[N],ifac[N];
vector<Z>work(int l, int r){
    if(l==r){
		return{c[l],b[l]};
    } 
	int mid=(l+r)>>1;
    return work(l,mid)*work(mid+1,r);
}
void init(int n){
	fac[0]=1;
    for(int i=1;i<=n;++i){
		fac[i]=fac[i-1]*i;
    } 
	ifac[n]=Pow(fac[n]);
    for(int i=n;i;--i){
    	ifac[i-1]=ifac[i]*i;
    }
}
vector<Z>a,d,res;
int main(){
    Init();
    init(N-1);
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        a.resize(n+1);
        for(int i=0;i<=n;++i){
    	    scanf("%d",&a[i].x);
			a[i]*=fac[i];
        } 
		for(int i=2;i<=n;++i){
			scanf("%d",&b[i]);
		}
		for(int i=2;i<=n;++i){
			scanf("%d",&c[i]);
		}
        d=work(2,n);
        reverse(d.begin(),d.end());
        res=d*a;
        for(int i=0;i<=n;++i){
			printf("%d%c",(res[i+n-1]*ifac[i]).x," \n"[i==n]);
		} 
    }
    return 0;
}

一个短很多的板子,感谢cls的板子…

namespace NTT//优化过的ntt,使用时记得初始化。998244353,1004535809,469762049,985661441,167772161. g = 3.950009857,g=7
{
    const int p = 998244353,g = 3;
    int w[maxn<<2],inv[maxn<<2],r[maxn<<2],last;
    int mod(int x){return x >= p ? x - p : x;}
    ll qp(ll base,ll n)
    {
        base %= p;
        ll res = 1;
        while(n){
            if(n&1) (res *= base) %= p;
            (base *= base) %= p;
            n >>= 1;
        }
        return res;
    }

    void init()
    {
        int lim = maxn << 1;//最长数组的两倍
        inv[1] = 1;
        for(int i=2;i<=lim;i++) inv[i] = mod(p - 1ll * (p / i) * inv[p%i] % p);
        for(int i=1;i<lim;i<<=1)
        {
            int wn = qp(g,(p - 1) / (i<<1));
            for(int j=0,ww=1;j<i;j++,ww=1ll*ww*wn%p) w[i+j] = ww;
        }
    }

    void ntt(vector<int> &f,int n,int op)
    {
        if(last!=n)
        {
            for(int i=1;i<n;i++) r[i] = (r[i>>1]>>1)|((i&1)?(n>>1):0);
            last=n;
        }
        for(int i=1;i<n;i++) if(i<r[i])swap(f[i],f[r[i]]);
        for(int i=1;i<n;i<<=1)
        for(int j=0;j<n;j+=i<<1)
            for(int k=0;k<i;k++)
            {
                int x=f[j+k],y=1ll*f[i+j+k]*w[i+k]%p;
                f[j+k]=mod(x+y);f[i+j+k]=mod(x-y+p);
            }
        if(op==-1)
        {
            reverse(&f[1],&f[n]);
            for(int i=0;i<n;i++)f[i]=1ll*f[i]*inv[n]%p;
        }
    }
}
using NTT::ntt;

Windows下TensorRT+YOLOv11部署避坑指南:从CUDA配置到模型加密全流程 本文详细解析了在Windows平台部署YOLOv11与TensorRT的全流程,重点涵盖从CUDA环境配置、工程编译适配到模型加密保护的实战指南。基于wang-xinyu的tensorrtx仓库,提供了详细的版本选择、编译问题修复方案,并深入探讨了如何对TensorRT引擎进行加密,以实现高效且安全的端到端部署。 阅读详情

相关推荐

MSP430开发入门:手把手教你用IAR EW430从建工程到烧录调试(附F5529配置)

本文详细介绍了如何使用IAR Embedded Workbench(EW430)进行MSP430F5529开发板的嵌入式开发,从环境搭建、工程配置到硬件调试全流程。通过实战示例和关键配置技巧,帮助开发者快速掌握MSP430开发的核心要点,包括LED控制、定时器使用和低功耗优化等实用技术。

weixin_30240349的博客 391

FFT简单入门(板子)

https://www.cnblogs.com/zzqsblog/p/5665654.html 下面其实是写给自己查阅的,真正要学可以看上面的。 OI里的fft并没有那么神奇,可以简单理解为加速卷积(多项式)的工具。 设n次多项式A,B,本来需要n^2的时间求其乘积(卷积),使用fft可以加速成n log n. n次单位复数根 满足w^n=1的复数。 由复数乘法性质,幅角相加,长度...

一位蒟蒻的小博客 1259

DeepSeek与豆包无缝对接:5分钟搞定智能周报自动化(附完整代码)

本文详细介绍了如何利用DeepSeek与豆包API,快速搭建一个智能周报自动化系统。通过整合豆包平台的工作流数据,并调用DeepSeek大模型进行深度分析与内容生成,该系统能在5分钟内自动抓取、分析多源信息,并生成结构清晰、富有洞察力的团队周报,显著提升工作效率。

weixin_29029995的博客 492

FFT(板子)

FFT FFT其实就是求两个多项式的乘积的一个算法,里面具体的证明和思路我还不太懂,只是会用模板。 多项式的存储 struct Complex { double x, y; Complex operator+ (const Complex& t) const //复数的运算 { return {x + t.x, y + t.y}; } Complex operator- (const Complex& t) const {

qq_45719639的博客 365

斯坦福大学CS224d基础1:线性代数知识

本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。

龙心尘 2万+

CANdelaStudio实战:如何用19服务快速编辑DTC快照数据(附Excel模板)

本文详细介绍了在CANdelaStudio中利用19服务高效编辑DTC快照数据的进阶技巧。通过导出DTC池至Excel进行批量编辑,结合‘Copy from DTC Pool’功能实现配置复用,并分享了构建自定义Excel模板与字段映射的实用方法,帮助工程师将繁琐的手动配置转化为工程化的批量处理,大幅提升诊断数据库开发效率。

weixin_29230773的博客 191

十分简明易懂的FFT(快速傅里叶变换)

快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。——百度百科,中文名快速傅里叶变换。

Thomas会写字 4万+

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。

失心少年 1382

板子:FFT/NTT

序言 这篇文章是自己看的,外面有这么多优秀的博客多好。 这是我在复赛前那个暑假的一个噩梦。。。最终我还是花了一天时间搞出来了,这说明我天赋一般,虽然即使说明了我天赋一般也没有什么用。。该干啥还是得干啥。其实天赋没啥用的,真正的是方法什么的比较重要,以及平时各种能力的积累,最终体现在天赋上,也就是说天赋是可以改变的,天赋和智商差距应该还是蛮大的。我在说啥。。。。。 感谢很多优秀的博主带来的优秀...

少主大人殿下的博客 618

24. SAP UI5 应用如何使用 OData 数据模型

本教程之前的二十三个步骤,使用的数据模型都是 JSON 模型。从本步骤开始,我们要学习另一种非常重要的数据模型:OData 数据模型。 OData 数据模型也是 SAP 产品里广泛使用的数据模型,比如 SAP S/4HANA,SAP CRM Fiori 应用等等,都使用的是 OData 数据模型而不是 JSON 数据模型。 使用 OData 数据模型的典型场景就是,通过 OData 模型提供的 Read API,将远端服务器上存储的数据通过 OData 协议读取到客户端,并显示在 SAP UI5 应用里。.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5797

鲁棒优化 (Robust Optimization) 算法详解及案例分析

鲁棒优化是一种用于处理不确定性优化问题的方法。其目标是在不确定性参数的可能取值范围内,找到一个对不确定性具有鲁棒性的解。

闲人编程的博客 4328

NTT多项式板子

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int input=1000000; char InPut[1000005]; inline char GetChar() { if(input>=1000000)fread(InPut,1,1000000,stdin),input=0; return InPut[input++]; } #defin

Darkside的博客 306

2025最新!视频动作识别算法的前沿研究与论文解读

2025最新!视频动作识别算法的前沿研究与论文解读 ,人工智能,计算机视觉,大模型,AI,本文聚焦2025年视频动作识别算法前沿,先介绍其定义、意义及核心挑战,再阐述传统与深度学习方法。还解读了基于Transformer、轻量化、跨模态融合和半监督学习的前沿研究,解释关键概念,列举常用数据集、评价指标,分析当前问题与未来趋势,为该领域研究提供全面参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

关于FFT(思路来源+板子整理)

思路来源 FFT详解 https://blog.youkuaiyun.com/ggn_2015/article/details/68922404 FFT代码 https://blog.youkuaiyun.com/hlyfalsy/article/details/9938547 https://blog.youkuaiyun.com/XieNaoban/article/details/69486299 FFT+NTT的理...

小衣同学的博客 414

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

FFT & FNT 简要整理

几周前搞了搞……有点时间简要整理一下,诸多不足之处还请指出。   有哪些需要理解的地方? 点值表示:对于多项式 \(A(x)\),把 \(n\) 个不同的 \(x\) 代入,会得出 \(n\) 个不同的 \(y\),在坐标系内就是 \(n\) 个不同的点,那么这 \(n\) 个点唯一确定该多项式 为什么引入单位根 \(\omega\) 作为变量 \(x\):若代入一些 \(x\) ,使...

weixin_30492601的博客 317

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

EI 的第二代多项式板子整体架构理念

这是一次将多项式模板的易用性与高效性结合的尝试。进度见此 pastebin 怎样有易用性? 封装,用一个 vector&lt;int&gt; 来存多项式,重载各种运算,特点是用的时候比较轻松,但本身的特性导致效率必然不能达到最优。 大概开放形如这样的接口: struct Poly { Poly(const vector&lt;int&gt;&amp; v); // init by vector...

Entropy Increaser 的博客 1976

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

生成函数在算法竞赛中的实战指南:从组合计数到NTT加速

在算法竞赛中,组合计数题往往因限制条件繁多而难以手推,生成函数则把“数数”翻译成多项式运算:构造因子并相乘,x^k的系数就是答案总数。普通生成函数(OGF)适合处理同种物品的选取数量,指数生成函数(EGF)则应对带标号元素的排列与集合划分问题。借助NTT,多项式卷积复杂度可降至O(n log n),将原本需要O(n^2)甚至O(n^3)的动态规划显著加速。这一技术广泛应用于多重集组合、线性递推求第n项、斯特林数、随机期望等场景,是解决大规模计数问题的利器。本文从生成函数的核心原理出发,梳理OGF与EGF的选

weixin_34343308的博客 295

多项式专题

除法、开根、exp、多点插值、快速求值、拉格朗日插值的板子还没有整理,重心拉格朗日插值法还不会,正在补坑中。 \(\color{red}{\text{约定:}}\) \(1.F(x)\)表示一个普通的项数为\(2\)的幂次多项式,\(F_D(x)\)是他的点值表示。 \(2.w\)代表单位根,\(w_m\)表示\(m\)次单位根。 \(3.A\)代表一个数列。 \(4.g\)表示原根。 ...

acw10104的博客 556

多项式模板&题目整理

注:多项式的题目,数组应开:N的最近2的整数次幂的4倍。 多项式乘法 FFT模板 时间复杂度\(O(n\log n)\)。 模板: void FFT(Z *a,int x,int K){ static int rev[N],lst; int n=(1<<x); if(n!=lst){ for(int i=0;i<n;i++)rev[i]=(...

weixin_34219944的博客 121

maomao的每日动向

\(2019.02.04\) \(Nothing\) \(to\) \(do\). \(2019.02.05\) - 早上睡到\(12\)点 - 中午下午:吃饭串门拜年 - 晚上:吹爆《流浪地球》!!!(虽然因为记错时间只看成了后一半) - (打算明天重刷) \(2019.02.06\) - 上午二刷《流浪地球》 - 下午补习《星际穿越》 - 晚上重新把《魔禁III》追上进度 - 《时间移民》阅读...

weixin_34116110的博客 226

位运算卷积完全指南:FMT与FWT的OR/AND/XOR变换解析

卷积是信号处理与算法竞赛中的基础概念,传统快速傅里叶变换(FFT)专攻加法卷积,而位运算(OR/AND/XOR)卷积则需借助快速莫比乌斯变换(FMT)与快速沃尔什变换(FWT)。这两大算法通过变换域中的逐点相乘,将复杂度从O(4^n)优化至O(n·2^n),是集合幂级数与状压DP的关键加速器。文章以洛谷模板题P4717为切入点,深入拆解三种位运算卷积的变换原理、代码细节与逆变换实现,并延伸至异或背包、树上DP等实际场景。理解FMT与FWT,能显著提升处理位运算卷积相关问题的效率,也是掌握子集卷积的前置基础。

weixin_29304021的博客 245

2019纪中暑假游记+总结

travels总篇\texttt{travels总篇}travels总篇 7/5\texttt{7/5}7/5 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发。 因为走南沙大桥所以很快就到了(具体有多快忘了,反正路上一点都不塞车)。就愉快的去整理宿舍+洗个早。很快搞定去电脑室,发现没有座位,就辗转了几趟从303到401又到402。算是愉快的安定下来,听老师吹会水开始无目的做...

QuantAsk 815

HEOI2019 游记——240秒处的起死回生

我还没死 Day-1 最后一场模拟赛! T1:自然数幂次和再前缀和,还是O(k)次多项式,拉格朗日插值,,,,,不能总想斯特林数啊!!! T2:神仙DP预处理。。。 T3:AC自动机+LCA处差分+暴力KMP 。。。 成功打了3个暴力100pts滚粗。。。 实力垫底 我HEOI要凉了 下午写了写fhq-treap,可持久化文艺平衡树 教练统一批准, 晚上没有...

weixin_34417200的博客 383

算法题知识点总结与代码模板

一次整理总结

xxwl585的博客 237
上一篇: 二分图匹配之HK算法(知识点总结)
下一篇: CCPC-Wannafly Winter Camp Day3 F.小清新数论(数论分块+(莫比乌斯反演/杜教筛))
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值