兩個多項式的卷積 對詢問分塊

2021-10-25 08:56:53 字數 2385 閱讀 9475

兩個多項式的卷積

思路:對詢問分塊,當湊夠一定數量的修改時進行一次ntt,然後每次查詢就直接暴力求還沒有進行ntt的那一部分的貢獻,塊大小為sqrt(n*log(n))最合適,注意坑點:輸入的a[i]和b[i]是有可能小於0的!

#include

#include

#include

#include

using

namespace std;

const

int max_n=

100100

;const

long

long mod=

998244353

;const

long

long g=3;

const

long

long gi=

332748118

;long

long a[max_n]

,b[max_n]

;int lim;

int st_p[max_n]

,st_q[max_n]

,cnt=0;

long

long a[

2*max_n]

,b[2

*max_n]

;long

long sum[

2*max_n]

,sum[max_n]

;long

long

ask(

int l,

int r)

long

long

ask(

int l,

int r)

int limit=

1,l,r[max_n]

;inline

long

long

pow_mod

(long

long a,

long

long n,

long

long m)

a=(a*a)

%m; n>>=1;

}return ans;

}inline

void

ntt(

long

long

*a,int type)

for(

int mid=

1;mid

}}}void

solve

(int n,

int m)

for(

int i=

0;i) r[i]

=(r[i>>1]

>>1)

|((i&1

)<<

(l-1))

;for

(int i=n+

1;i) a[i]=0

;for

(int i=m+

1;i) b[i]=0

;ntt

(a,1);

ntt(b,1)

;for

(int i=

0;i) a[i]

=(a[i]

*b[i]

)%mod;

ntt(a,-1

);long

long inv=

pow_mod

(limit,mod-

2,mod)

;for

(int i=

0;i<=n+m;i++

) a[i]

=a[i]

*inv%mod;

}int n;

void

build()

intmain

(void

)for

(i=0

;i<=n;i++

)scanf

("%d"

,&m)

; lim=

sqrt

(m*log2

(n))

; sum[0]

=b[0];

for(i=

1;i<=n;i++

) sum[i]

=(sum[i-1]

+b[i]

)%mod;

build()

;//cout

(i=1

;i<=m;i++

)printf

("%lld\n"

,ans);}

else

if(op==2)

if(cnt==lim)

}return0;

}

兩個多項式相加!

以下是本人用單鏈表所編寫的兩個多項式相加的程式,不知為何在turboc2.0上執行總有兩個errors,而且都是 declaration syntax error 還請業內高手指導!謝謝!include math.h include stdio.h typedef struct node polyn...

兩個多項式求和

提到多項式想必定會想到其係數和指數,定義資料結構typedef struct polynomialpolynomial,linklist 之所以運用單鏈表實現該功能是因為會涉及資料的插入與刪除等操作,單鏈錶比順序表靈活 方便。當在進行相加功能操作時,要比較當前指標所指結點的指數大小,如果不相等,就將...

兩個多項式相加

每組有兩行,每行由若干空格隔開的整數構成,以回車標誌結束。每行第乙個數表示本行有幾項,每一項由兩個整數表示,第1個整數表示係數,第2個整數表示次數。include includetypedef struct node node struct node creatnode int coe,int ex...