NTT多项式板子

MTT板子 (任意模数NTT,任意模数多项式乘法) MTT 用了 555 次 FFTFFTFFT P4245 【模板】任意模数多项式乘法 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double lld; const int mo=998244353, N=1e6+5; struct MTT { struct cp { lld x,y; inline void init() 阅读详情
#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++];
}
#define GetChar() getchar()
template<typename Typename>
inline void Read(Typename &s)
{
    register bool f=false;register char c=GetChar();
    s=0.0;
    while(c>'9'||c<'0'){if(c=='-')f=true;c=GetChar();}
    while(!(c>'9'||c<'0')){s=s*10+c-48;c=GetChar();}
    if(f)s=-s;
}
const long long Mod=998244353;
const int Maxn=3e5;
template<typename Typename>
inline void Swap(Typename &x,Typename &y)
{register Typename swap=x;x=y;y=swap;}
inline long long GetPow(long long base,long long index)
{
    long long power=1;base%=Mod;
    while(index!=0)
    {
        if(index&1)power=power*base%Mod;
        index>>=1;base=base*base%Mod;
    }
    return power;
}
int Rev[Maxn];long long Gn[31],Gi[31];
inline void RevInit(int limit,int len)
{
    for(register int i=1;i<limit;i++)
        Rev[i]=(Rev[i>>1]>>1)|((i&1)<<(len-1));
}
inline void NTTInit()
{
    for(register int i=1,g=1;g<=30;g++,i<<=1)
    {
        Gn[g]=GetPow(3,(Mod-1)/(i<<1));
        Gi[g]=GetPow(Gn[g],Mod-2);
    }
}
inline void NTT(long long *Arr,int limit,bool flag=true)
{
    for(register int i=0;i<limit;i++)
        if(i<Rev[i])Swap(Arr[i],Arr[Rev[i]]);
    for(register int i=1,g=1;i<limit;i<<=1,g++)
    {
        register long long T=flag?Gn[g]:Gi[g];
        for(register int j=0;j<limit;j+=(i<<1))
        {
            register long long W=1;
            for(register int k=0;k<i;k++,W=(W*T)%Mod)
            {
                register long long x=Arr[j+k],y=W*Arr[j+k+i]%Mod;
                Arr[j+k]=(x+y)%Mod;Arr[j+k+i]=(x-y+Mod)%Mod;
            }
        }
    }
    if(flag)return;
    long long I=GetPow(limit,Mod-2);
    for(register int i=0;i<limit;i++)Arr[i]=Arr[i]*I%Mod;
}
long long Copy[Maxn];
inline void GetInv(long long *Arr,long long *Inv,int n)
{
    int now=1,limit=2,len=1;
    Inv[0]=GetPow(Arr[0],Mod-2);
    while(now<=n*2)
    {
        RevInit(limit,len);
        for(register int i=0;i<now;i++)Copy[i]=Arr[i];
        for(register int i=now;i<limit;i++)Copy[i]=0;
        NTT(Copy,limit);NTT(Inv,limit);
        for(register int i=0;i<limit;i++)
            Inv[i]=((2ll-Inv[i]*Copy[i]%Mod)+Mod)%Mod*Inv[i]%Mod;
        NTT(Inv,limit,false);
        for(register int i=now;i<limit;i++)Inv[i]=0;
        now<<=1;limit<<=1;len++;
    }
}
inline void GetDev(long long *Arr,long long *Inv,int n)
{
    for(register int i=1;i<n;i++)Inv[i-1]=i*Arr[i]%Mod;
    Inv[n-1]=0;
}
inline void GetInvDev(long long *Arr,long long *Inv,int n)
{
    for(register int i=1;i<n;i++)Inv[i]=Arr[i-1]*GetPow(i,Mod-2)%Mod;
    Inv[0]=0;
}
long long TmpAi[Maxn],TmpBi[Maxn];
inline void GetLn(long long *Arr,long long *Inv,int n)
{
    for(register int i=0;i<=(n<<1);i++)TmpAi[i]=0;
    for(register int i=0;i<=(n<<1);i++)TmpBi[i]=0;
    GetDev(Arr,TmpAi,n);
    GetInv(Arr,TmpBi,n);
    int limit=1,len=0;
    while(limit<(n<<1))limit<<=1,len++;
    RevInit(limit,len);
    NTT(TmpAi,limit);NTT(TmpBi,limit);
    for(register int i=0;i<limit;i++)TmpAi[i]=TmpAi[i]*TmpBi[i]%Mod;
    NTT(TmpAi,limit,false);
    GetInvDev(TmpAi,Inv,n);
}
long long TmpCi[Maxn],TmpDi[Maxn];
inline void GetExp(long long *Arr,long long *Inv,int n)
{
    int len=1,limit=2,now=1;
    Inv[0]=1;
    while(now<=n*2)
    {
        RevInit(limit,len);
        for(register int i=0;i<limit;i++)TmpCi[i]=0;
        for(register int i=0;i<now;i++)TmpDi[i]=Arr[i];
        for(register int i=now;i<limit;i++)TmpDi[i]=0;
        GetLn(Inv,TmpCi,now);
        NTT(Inv,limit);NTT(TmpCi,limit);NTT(TmpDi,limit);
        for(register int i=0;i<limit;i++)
            Inv[i]=(1ll-TmpCi[i]+TmpDi[i]+Mod)*Inv[i]%Mod;
        NTT(Inv,limit,false);
        for(register int i=now;i<limit;i++)Inv[i]=0;
        now<<=1;limit<<=1;len++;
    }
}
long long F[Maxn],G[Maxn],RG[Maxn],RF[Maxn],_G[Maxn],Q[Maxn],R[Maxn];
int n,m,limit,len;
int main()
{
    NTTInit();
    scanf("%d%d",&n,&m);
    for(register int i=0;i<=n;i++)scanf("%lld",&F[i]),RF[n-i]=F[i];
    for(register int i=0;i<=m;i++)scanf("%lld",&G[i]),RG[m-i]=G[i];
    for(register int i=n-m+1;i<=m;i++)RG[i]=0;
    for(register int i=n-m+1;i<=n;i++)RF[i]=RG[i]=0;
    GetInv(RG,_G,n-m);

    limit=1,len=0;
    while(limit<=n+n-m)limit<<=1,len++;
    RevInit(limit,len);
    NTT(RF,limit);NTT(_G,limit);
    for(register int i=0;i<limit;i++)RF[i]=RF[i]*_G[i]%Mod;
    NTT(RF,limit,false);
    for(register int i=0;i<=n-m;i++)Q[i]=RF[n-m-i],printf("%lld ",Q[i]);
    for(register int i=2*n-m+1;i<limit;i++)RF[i]=0;
    printf("\n");

    limit=1,len=0;
    while(limit<=n)limit<<=1,len++;
    RevInit(limit,len);
    NTT(G,limit);NTT(Q,limit);
    for(register int i=0;i<limit;i++)G[i]=G[i]*Q[i]%Mod;
    NTT(G,limit,false);
    for(register int i=0;i<m;i++)R[i]=(F[i]-G[i]+Mod)%Mod,printf("%lld ",R[i]);

    return 0;
}
比FFT还容易明白的NTT(快速数论变换) NTTNTTNTT相关 一种快速数论变换算法,这种算法是以数论为基础,对样本点为的数论变换,按时间抽取的方法,得到一组等价的迭代方程,有效高速简化了方程中的计算公式·与直接计算相比,大大减少了运算次数。(见快速傅里叶变换)。 在计算机实现多项式乘法中,我们所熟知的快速傅里叶变换(FFT)是基于n次单位根 (omega) 的优秀性质实现的,而由于其计算时会使用正弦函数和余弦函数,在不... 阅读详情

相关推荐

PICO SCOPE 二次开发

基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集

nixoncheng的博客 1147

FFT/NTT(板子整理)

思路来源 https://www.cnblogs.com/candy99/p/6641972.html FTT板子整理 //fft #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using...

小衣同学的博客 1580

基于cat12搞定SBM的ROI的统计分析——vertex水平和ROI水平的双样本T检验

前言 一、Atlas皮层图谱介绍 二、SBM分析——主要以皮层四种常用指标中的厚度(thickness)和沟深(depth)为主

Sophia2023的博客 8749

板子:FFT/NTT

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

少主大人殿下的博客 618

Silvaco TCAD实战 | SiC MOSFET工艺仿真与关键参数DOE分析

本文详细介绍了使用Silvaco TCAD进行SiC MOSFET工艺仿真与关键参数DOE分析的实战方法。通过外延生长建模、离子注入工艺调试等步骤,结合DOE分析优化器件性能,帮助工程师在设计阶段预判电学特性,提升产品可靠性。文章还分享了网格划分、界面态建模等实用技巧,助力实现从仿真到产品的闭环验证。

weixin_30235225的博客 505

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

NTT板子 -- from ACdreamer -- test by HDU6061

NTT板子 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int MAXN = 400040; typedef long long LL; const int N = 100005; const int P =...

weixin_34050519的博客 173

DDD系列 - 第12讲 如何在DDD中实现Query服务(轻量化CQRS)

轻量化CQRS、整合Repository和DAO的优势。

罗小爬的技术宝书 266

NTT板子

话说NTT真不是一般的快啊。。。。 还有到底用那个模数啊。。。。 UOJ模数会不会出问题啊。。。 算了,就用UOJ模数吧。。。 代码: #include #include #include #include #include #include #define ll long long #define max(a,b) a>b?a:b #define min(a,b) a using

玫葵之蝶 950

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 341

Python爬虫:抓取外卖平台餐厅菜单、价格与评价数据

美团外卖:国内领先的外卖平台之一,提供餐饮外卖、超市配送等服务。饿了么:另一大主流外卖平台,覆盖广泛的餐饮品类。等:国际性的外卖平台。在本文中,我们将以美团外卖为例,展示如何抓取餐厅的菜单、价格和评价等数据。我们会使用Python的爬虫库,如Scrapy和Selenium,来解决抓取任务。本文详细介绍了如何使用Python爬虫抓取外卖平台上的餐厅菜单、价格、评价等信息。我们展示了如何使用Scrapy和Selenium抓取静态与动态网页数据,如何清洗和存储数据,并讨论了如何应对外卖平台的反爬虫机制。

2201_76125261的博客 1499

多项式板子

咱的多项式板子,从\(NTT\)到反三角函数应有尽有 常数应该比较小,你谷上的板子提交里一般能跑到第一页的 似乎我就没见过几个人现在还在用数组写多项式的了…… //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) #defin...

weixin_34138377的博客 145

labelImg使用教程

Anaconda环境 安装 Anaconda 之后,在开始菜单下找到 Anaconda 文件夹 找到 Anaconda Prompt 点击运行 安装 labelImg pip install labelImg #直接命令行输入 启动 labelImg labelImg #直接命令行输入名称即可 labelImg界面 开始标注 快捷键:W(创建方框),A(上一张),D(下一张) XML文件示例 <annotation> <folder>夜读</folder>

G果的博客 3万+

P5821 【L&K R-03】密码串匹配

【代码】P5821 【L&K R-03】密码串匹配。

2302_78855882的博客 163

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

快速数论变换与多项式常用运算

NTT和多项式的常用基本操作。

KaiserWilheim的博客 519

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

多项式求逆

这个算法大概可以叫倍增吧 这里讲的很好 大概实现的时候就是一个递归 具体细节挺多 可以看我的代码:(这个是洛谷板子的) #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;algorithm&gt; #include&lt;c...

玫葵之蝶 660

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【NTT】【多项式】洛谷P5158 多项式快速插值(log^2)

快速插值O(Nlog2N)O(N log^2 N)O(Nlog2N)板子。 话说这代码居然比O(Nlog3N)O(N log^3 N)O(Nlog3N)更短更好写。。。 实测本题O(Nlog3N)O(N log^3 N)O(Nlog3N)的时间是O(Nlog2N)O(N log^2 N)O(Nlog2N)的5~6倍左右。 #include&lt;cstdio&gt; #include&lt;cst...

氧化钠的博客 403

巨型多项式板子集合...

300+行完成几乎所有多项式操作… (不得不说指针真是个好东西) #include<bits/stdc++.h> #define Set(a,b) memset(a,b,sizeof(a)) #define Clear(a,_begin_,_end_) for(int i=_begin_;i<_end_;++i) a[i]=0 #define Input_Array(a,_beg...

Yu Gi Oh! 262

51Nod 1028 大数乘法 V2

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #include<algorithm> #include<iostream> #include<cstring> #include<cs...

weixin_30722589的博客 115

多项式求逆板子

建议搭配NTT板子食用~ 并且注意,函数结束后有可能需要清空[toap,2*toap)的值,不清空可能会爆 void GetInv(int a[],int ni[],int toap) { int i,now; ni[0]=ksm(a[0],MOD-2); for(now=2;now&lt;=toap;now&lt;&lt;=1){ fill(...

include / Hdhd 261

2019.03.18【洛谷P5245】【模板】多项式快速幂(NTT)(多项式Ln)(多项式Exp)

传送门 解析: 直接做的话还是可以mod&ThinSpace;&ThinSpace;p\mod pmodp后做快速幂,那样的话就有两个log⁡\loglog 实际上由于a0=1a_0=1a0​=1,可以考虑两边取对数: ln⁡B(x)=kln⁡A(x)\ln B(x)=k\ln A(x)lnB(x)=klnA(x) 取对数,一乘,再exp回去就做完了。 代码: #include...

zxyoi_dreamer的博客(不定期诈尸) 489

多项式总结&多项式板子

多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\)阶导,那么 \[f(x)=\sum_{i=0}^{\infty}\frac{f^i(x_0)}{i!}(x-x_0)^i\] 称作\(f(x)\)在\(x_0\)处的泰勒展开。 前置知识:牛顿迭代 ...

weixin_30256901的博客 295

多项式板子集

收集各种板子(方便背诵)

lahlah的博客 455
上一篇: SizeBalancedTrees
下一篇: Ural 1682 做题笔记
DarksideCoder
博客等级 码龄7年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值