bzoj2956 模積和 (分塊)

2021-08-11 18:05:44 字數 1914 閱讀 4436

原題位址

題意:

求∑∑((n mod i)*(m mod j)),其中1<=i<=n,1<=j<=m,i≠j。答案 mod 19940417

資料範圍

n,m<=10^9

題解:∑n

i=1∑

mj=1

((nm

odi)

∗(mm

odj)

)(i≠

j) =

∑ni=

1∑mj

=1((

nmod

i)∗(

mmod

j))−

∑min

(n,m

)i=1

((nm

odi)

∗(mm

odi)

) 前一部分 =∑

ni=1

∑mj=

1((n

−i∗⌊

ni⌋)

∗(m−

j∗⌊m

j⌋))

=∑ni=1(

n−i∗

⌊ni⌋

)∑mj

=1(m

−j∗⌊

mj⌋)

可以分塊做。

後一部分=∑

min(

n,m)

i=1(

(nmo

di)∗

(mmo

di))

=∑min(n

,m)i

=1((

n−i∗

⌊ni⌋

)∗(m

−i∗⌊

mi⌋)

) =∑

min(

n,m)

i=1(

n∗m−

i∗⌊n

i⌋∗m

−i∗⌊

mi⌋∗

n+i2

⌊mi⌋

⌊ni⌋

) 也可以分塊做。

其中用到了 1+

2+..

+n=(

1+n)

∗n2

和12+

22+.

.+n2

=n∗(

1+n)

∗(2n

+1)6

因為19940417和2、6互質,可以預處理逆元。

**:

#include

#include

#include

#include

using namespace std;

const int mod=19940417;

const int phi=17091780;

const int inv2=9970209;

const int inv6=3323403;

int n,m;

int main()

ret1=((1ll*m

*m)%mod-ret1+mod)%mod;

for(int ed,i=1;i<=n;i=ed+1)

ret2=((1ll*n

*n)%mod-ret2+mod)%mod;

int ans=(1ll*ret1

*ret2)%mod;

int ret=0;

for(int ed,i=1;i<=min(n,m);i=ed+1)

ret=((1ll*((1ll*min(m,n)*n)%mod)*m)%mod-ret+mod)%mod;

ans=(ans-ret+mod)%mod;

printf("%d\n",ans);

return

0;}

BZOJ 2956 模積和 (分塊)

bzoj 1257的加強版,多了乙個?那就把它展開來啦。i 1n j 1m nmo di mmo dj i j i 1n j 1 m nm odi mm odj i 1n n ni i m mi i i 1n j 1m nmod i mmod j i 1n nm n m i i m ni i n i...

BZOJ2956 模積和 分塊

求 n mod i m mod j 其中1 i n,1 j m,i j。第一行兩個數n,m。乙個整數表示答案mod 19940417的值 3 41 樣例說明 答案為 3 mod 1 4 mod 2 3 mod 1 4 mod 3 3 mod 1 4 mod 4 3 mod 2 4 mod 1 3 m...

BZOJ 2956 模積和 分塊 數學

一開始忘記了平方數列求和,鬱悶 sum n n n 1 2 n 1 6 其實打乙個表是看得出規律的,但是要進行運算我們還是得把他變成數學公式才可以啊 對於取模運算 n i n ni i化簡以後就是喜聞樂見地 分塊了 include include include define inv 3323403...