题目描述
给定一个 n 次多项式 F(x) 和一个 m 次多项式 G(x) ,请求出多项式 Q(x), R(x),满足以下条件:
Q(x) 次数为 n−m,R(x) 次数小于 m
F(x) = Q(x) * G(x) + R(x)
所有的运算在模 998244353 意义下进行。
输入格式
第一行两个整数 n,m,意义如上。
第二行 n+1个整数,从低到高表示 F(x) 的各个系数。
第三行 m+1 个整数,从低到高表示 G(x) 的各个系数。
输出格式
第一行 n−m+1 个整数,从低到高表示 Q(x) 的各个系数。
第二行 m 个整数,从低到高表示 R(x) 的各个系数。
如果 R(x) 不足 m−1 次,多余的项系数补 0。
证明过程见笔记本。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#define ll long long
#define llu unsigned ll
#define int ll
using namespace std;
const int maxn=8e5+100;
const int p=998244353;
const int gg=3;
int fi[maxn];
int f[maxn],g[maxn],q[maxn],r[maxn],c[maxn];
int fr[maxn],gr[maxn],invg[maxn];
int mypow(int a,int b)
{
if(b<0) return mypow(mypow(a,p-2),-b);
int ans=1;
while(b)
{
if(b&1) ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
void ntt(int *x,int len,int f)
{
for(int i=0