낙 곡 4512: [템 플 릿] 다항식 나눗셈 - 문제 풀이
문 제 는 직접 본 문 제 를 보시오.
템 플 릿 문 제 는 아무 말 도 하지 않 습 니 다. 해석 은 볼 수 있 습 니 다.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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.