首页 > 其他分享 >P4512 【模板】多项式除法

P4512 【模板】多项式除法

时间:2024-02-12 16:22:21浏览次数:30  
标签:dfrac1x limits int 多项式 sum nf P4512 除法 模板

为什么不能直接用 \(F(x) \times G(x)^{-1}\) 做?

\(G(x)^{-1}\) 是模 \(x^{m+1}\) 意义下的,\(n - m > m\) 时得到的 \(Q(x)\) 就是错的。

记 \(F'(x)\) 为 \(F(x)\) 系数翻转后的多项式,即若 \(F(x) = \sum\limits_{i = 0}^nf_ix^i\),则 \(F'(x) = \sum\limits_{i = 0}^nf_{n - i}x^i = \sum\limits_{i = 0}^nf_ix^{n - i}\)。

\[F'(x) = x^nF(\dfrac1x) \]

\(G'(x), Q'(x), R'(x)\) 同理。

然后开始推式子,目标是把模 \(x^{m+1}\) 替换为模 \(x^{n-m+1}\)。

代入 \(\dfrac1x\),得

\[F(\dfrac1x) = Q(\dfrac1x) * G(\dfrac1x) + R(\dfrac 1x) \]

同乘 \(x^n\),注意 \(Q(\dfrac1x) * G(\dfrac1x)\) 的次数正好是 \(n\),\(R(\dfrac1x)\) 的次数不大于 \(m - 1\),得

\[F'(x) = Q'(x) * G'(x) + x^{n-m+1}R'(x) \]

其实到这就已经推完了,加个模意义就好

\[F'(x) \equiv Q'(x) * G'(x) \pmod{x^{n-m+1}} \]

也即

\[Q'(x) = F'(x) * G'(x)^{-1} \pmod{x^{n-m+1}} \]

求出 \(Q(x)\) 之后用 \(F(x) = Q(x) * G(x) + R(x) \Rightarrow R(x) = F(x) - Q(x) * G(x)\) 求出 \(R(x)\) 即可。

时间复杂度是 \(\mathcal O(n \log n)\)。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 1 << 18, MOD = 998244353;

int n, m, f[N], g[N], r[N], q[N];
int bits, len, rev[N], Wn[2][18];

ll qp(ll base, int e = MOD - 2) {
    ll res = 1;
    while (e) {
        if (e & 1) res = res * base % MOD;
        base = base * base % MOD;
        e >>= 1;
    }
    return res;
}

void NTT(int *A, bool I = 0) {
    for (int i = 0; i < len; i++) if (i < rev[i]) swap(A[i], A[rev[i]]);
    for (int i = 1; i < len; i <<= 1) {
        ll wn = Wn[I][__builtin_ctz(i)];
        for (int j = 0; j < len; j += (i << 1)) {
            ll w = 1;
            for (int k = j; k < j + i; k++) {
                int t = w * A[k + i] % MOD;
                A[k + i] = (A[k] - t + MOD) % MOD, A[k] = (A[k] + t) % MOD;
                w = w * wn % MOD;
            }
        }
    }
    if (I) {
        ll invlen = qp(len);
        for (int i = 0; i < len; i++) A[i] = A[i] * invlen % MOD;
    }
}

inline void init(int n) {
    bits = -1, len = 1; while (len < n) len <<= 1, bits++;
    for (int i = 0; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bits);
}

int tmp[N];
void getinv(int n, int *const res, const int * f) {
    if (n == 1) {res[0] = qp(f[0]); return;}
    getinv((n + 1) >> 1, res, f);
    init((n << 1) - 1); memcpy(tmp, f, n << 2), fill(tmp + n, tmp + len, 0); NTT(tmp), NTT(res);
    for (int i = 0; i < len; i++) res[i] = res[i] * ((2 - (ll)tmp[i] * res[i]) % MOD + MOD) % MOD;
    NTT(res, 1); fill(res + n, res + len, 0);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> m;
    for (int i = 0; i <= n; i++) cin >> f[n - i];
    for (int i = 0; i <= m; i++) cin >> g[m - i];
    for (int i = 0; i < 18; i++) Wn[0][i] = qp(3, (MOD - 1) / (1 << (i + 1))), Wn[1][i] = qp(Wn[0][i], MOD - 2);
    n++, m++; getinv(n - m + 1, q, g);
    init((n << 1) - 1); memcpy(tmp, f, len << 2); NTT(q), NTT(tmp);
    for (int i = 0; i < len; i++) q[i] = (ll)q[i] * tmp[i] % MOD;
    NTT(q, 1); fill(q + n - m + 1, q + len, 0), reverse(q, q + n - m + 1);
    for (int i = 0; i <= n - m; i++) cout << q[i] << ' '; cout << '\n';
    reverse(f, f + n), reverse(g, g + m); init(n); NTT(g), NTT(q);
    for (int i = 0; i < len; i++) r[i] = (ll)g[i] * q[i] % MOD;
    NTT(r, 1); for (int i = 0; i < m; i++) r[i] = (f[i] - r[i] + MOD) % MOD;
    for (int i = 0; i < m - 1; i++) cout << r[i] << ' ';
    return 0;
}

标签:dfrac1x,limits,int,多项式,sum,nf,P4512,除法,模板
From: https://www.cnblogs.com/chy12321/p/18013955

相关文章

  • P3811 【模板】模意义下的乘法逆元
    原题链接题解由于时间限制过于严苛,遂采用线性递推方式\(p=k·i+b\),\((1\leqslantb<r<p)\)\(k·i+b=0\)\((mod\p)\)同时乘上\(i^{-1}\b^{-1}\)\(k·b^{-1}+i^{-1}=0\(mod\p)\)\(i^{-1}=-k·b^{-1}\(mod\p)\)\(i^{-1}=(-[\frac{p}{i}]+p)+(p\mod\i)^{-1}......
  • 各大排序的模板
    1.冒泡排序 1for(i=n;i>=1;--i)2{3for(j=1;j<=i;++j)4{5if(a[j]>a[j+1])6{7swap(a[j],a[j+1]);8}9}10}   2.快速排序1.懒人函数 1sort(a+1,a+n+1);   2.正常的1vo......
  • grafana模板参考
     空的,把面板都删除了{"__inputs":[{"name":"DS_PROMETHEUS","label":"Prometheus","description":"","type":"datasource","pl......
  • Link Cut Tree模板(从别人那里拿的)
    可以通过这道题#include<bits/stdc++.h>#defineRregisterint#defineIinlinevoid#defineGif(++ip==ie)if(fread(ip=buf,1,SZ,stdin))#definelcc[x][0]#definercc[x][1]usingnamespacestd;constintSZ=1<<19,N=3e5+9;charbuf[SZ],*ie=buf+SZ,*ip=......
  • BootstrapBlazor 模板适配移动设备使用笔记
    项目模板BootstrapBlazorApp模板为了方便大家利用这套组件快速搭建项目,作者制作了项目模板(ProjectTemplates),使用dotnetnew命令行模式,使用步骤如下:安装项目模板dotnetnewinstallBootstrap.Blazor.Templates::8.0.1创建工程dotnetnewbbapp官网教程https:......
  • Liquid模板引擎简单使用
    最近在写一个配置表导出工具,自动生成代码那边会用到模板引擎,所以就熟悉了下Liquid的使用。 需要用到一个DotLiquid的库usingDotLiquid;varlqTemplate=Template.Parse(templateContent);vartemplateHash=newHash();//todo逻辑部分using(varsw=newStrea......
  • 设计模式-模板方法模式(Template Method Pattern)
    #模板方法模式(TemplateMethodPattern)-记忆关键字:模板方法-定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤-类型:行为型-![UML类图](./design-pattern.png)##1.涉及的角色1)Abstr......
  • P4721 【模板】分治 FFT
    最具经济性的写法:\(\mathcalO(n^2)\)暴力拿下\(80\)分,遂跑路。一题多解了,分两部分:分治和多项式求逆。分治考虑cdq分治,每次把\(f_{l\dotsmid}\)和\(g_{1\dotsn-1}\)卷起来,贡献直接加到\(f_{mid+1\dotsr}\)里,要注意一下顺序,先递归左区间,再算当前区间,最......
  • TitanIDE v2.8.0正式发布,模板市场来袭!
    TitanIDEv2.8.0版本正式发布,模板市场中内置40+模版!什么是TitanIDETitanIDE,云端IDE,作为数字化时代研发体系不可或缺的一环,和企业建设好的云服务具有很高的互操作性。秉承“安全、高效、体验”的原则,连接研发体系的各个信息孤岛。Jira、GitLab、Jetbrains全家桶、AndroidStudio、V......
  • 浅蓝色小清新说说文章类个人网站模板代码
    浅蓝色小清新说说文章类织梦dedecms个人博客模板采用DIV+CSS自适应语言制作的文章信息网站模板。整个网站版面宽度为1000px宽度,页面主色调为蓝色,整体大气简洁。浅蓝色小清新说说文章博客模板适用于经典说说、伤感说说、个性说说、搞笑说说、爱情说说等各种QQ说说心情短......