낙 곡 4512: [템 플 릿] 다항식 나눗셈 - 문제 풀이

https://www.luogu.org/problemnew/show/P4512
문 제 는 직접 본 문 제 를 보시오.
템 플 릿 문 제 는 아무 말 도 하지 않 습 니 다. 해석 은 볼 수 있 습 니 다.http://blog.miskcoo.com/2015/05/polynomial-division
우리 가 요구 하 는 d 배열 의 최고 항목 은 n - m 이기 때문에 반 배열 을 구 할 때 그 길이 도 n - m 내 로 제한 해 야 한다. 그렇지 않 으 면 문제 가 생 길 수 있다.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll P=998244353;
const int G=3;
const int N=1e6+5;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
ll qpow(ll a,ll n,ll p){
    ll res=1;
    while(n){
    if(n&1)res=res*a%p;
    a=a*a%p;n>>=1;
    }
    return res;
}
void MTT(ll a[],int n,int on){
    for(int i=1,j=n>>1;i1;i++){
        if(i<j)swap(a[i],a[j]);
        int k=n>>1;
        while(j>=k){j-=k;k>>=1;}
        if(jk;
    }
    for(int i=2;i<=n;i<<=1){
    ll res=qpow(G,(P-1)/i,P);
        for(int j=0;ji){
        ll w=1;
            for(int k=j;k2;k++){
                ll u=a[k],t=w*a[k+i/2]%P;
                a[k]=(u+t)%P;
                a[k+i/2]=(u-t+P)%P;
                w=w*res%P;
            }
        }
    }
    if(on==-1){
    ll inv=qpow(n,P-2,P);
    a[0]=a[0]*inv%P;
    for(int i=1;i<=n/2;i++){
        a[i]=a[i]*inv%P;
        if(i!=n-i)a[n-i]=a[n-i]*inv%P;
        swap(a[i],a[n-i]);
    }
    }
}
void inv(int deg,ll a[],ll b[]){
    static ll t[N];
    if(deg==1){
    b[0]=qpow(a[0],P-2,P);
    return;
    }
    inv((deg+1)>>1,a,b);
    int n=1;
    while(n1))n<<=1;
    for(int i=0;ia[i];
    for(int i=deg;i0;
    MTT(t,n,1);MTT(b,n,1);
    for(int i=0;i)
    b[i]=b[i]*(2-b[i]*t[i]%P+P)%P;
    MTT(b,n,-1);
    for(int i=deg;i0;
}
//a(x)=b(x)d(x)+r(x)
void division(int n,int m,ll a[],ll b[],ll d[],ll r[]){
    static ll t1[N],t2[N];
    int nn=1,l=n-m+1;
    while(nn1))nn<<=1;
    for(int i=0;i1];
    for(int i=l;i0;
    inv(l,t1,t2);
    for(int i=l;i0;
    MTT(t2,nn,1);
    
    for(int i=0;i1];
    for(int i=l;i0;
    MTT(t1,nn,1);

    for(int i=0;iP;
    MTT(t1,nn,-1);
    for(int i=0;i1;i++)swap(t1[i],t1[l-i-1]);
    for(int i=0;it1[i];

    nn=1;
    while(nn1;
    for(int i=l;i0;
    MTT(t1,nn,1);
    for(int i=0;ib[i];
    for(int i=m;i0;
    MTT(t2,nn,1);
    for(int i=0;iP;
    MTT(t1,nn,-1);
    for(int i=0;i1;i++)r[i]=((a[i]-t1[i])%P+P)%P;
}
int n,m;
ll f[N],g[N],q[N],r[N];
int main(){
    n=read()+1,m=read()+1;
    for(int i=0;iread();
    for(int i=0;iread();
    division(n,m,f,g,q,r);
    for(int i=0;i1;i++)printf("%lld ",q[i]);
    puts("");
    for(int i=0;i1;i++)printf("%lld ",(r[i]+P)%P);
    puts("");
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++
+ 본문 저자: luyouqi 233.              +
+ 제 블 로그 에 오신 것 을 환영 합 니 다:http://www.cnblogs.com/luyouqi233/ +
+++++++++++++++++++++++++++++++++++++++++++
 
다음으로 전송:https://www.cnblogs.com/luyouqi233/p/9007666.html

좋은 웹페이지 즐겨찾기