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) 的优秀性质实现的,而由于其计算时会使用正弦函数和余弦函数,在不... 阅读详情

相关推荐

液晶屏LVDS接口:【图文详讲】

​LVDS(Low Voltage Differential Signaling,即低电压差分信号)接口又称RS-644总线接口,是20世纪90年代才提出的一种数据传输和接口技术。LVDS接口是美国NS美国国家半导体公司为克服以TTL电平方式传输宽带高码率数据时功耗大,电磁干扰大等缺点而研制的一种数字视频信号传输方式

weixin_66299220的博客 1万+

FFT/NTT(板子整理)

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

小衣同学的博客 1580

Windows10完美驱动Apple Studio Display:从雷电接口到亮度调节全攻略

本文详细介绍了如何在Windows10系统上完美驱动Apple Studio Display,涵盖雷电接口兼容性、亮度调节及色彩管理等关键问题。通过实测对比不同转接方案和显卡兼容性,推荐使用贝尔金VR线和NVIDIA GTX-1660显卡,并提供了BootCamp驱动安装和亮度调节的终极解决方案,帮助用户实现最佳显示效果。

elastic6hunter的博客 1121

板子:FFT/NTT

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

少主大人殿下的博客 618

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

嵌入式开发中Tab与空格混用的危害与统一规范实践

在软件工程中,代码格式一致性是保障可读性与团队协作效率的基础。从原理上看,制表符(Tab)与空格(Space)在存储与显示机制上存在本质差异:Tab是控制字符,其显示宽度取决于编辑器设置;空格则是固定宽度的字符。这种差异导致混用时会引发代码对齐错乱、版本控制冲突及跨平台兼容性问题,严重影响工程的可维护性。尤其在嵌入式开发领域,资源受限环境与高可靠性要求使得统一的编码规范更为关键。通过配置编辑器、集成clang-format等自动化工具,可以强制实现缩进风格的一致性,从而提升代码质量与团队协作效率。本文聚焦于

weixin_42545636的博客 276

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

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

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

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

Weka学习笔记01:初探Weka世界

下载、安装和启动Weka、Weka数据格式

howard2005的专栏 1471

多项式板子

咱的多项式板子,从\(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

openCv +3.4.0 车牌定位(C++版本)

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc.hpp> #include "opencv2/shape.hpp" using namespace ...

Bamboo265925的博客 2337

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

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

2302_78855882的博客 163

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

KaiserWilheim的博客 519

IMSL CNL 7.0.0 (x86-64)Crack

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

多项式求逆

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

玫葵之蝶 660

怀旧版电脑GBC模拟器

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

【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、付费专栏及课程。

余额充值