原題位址:
題意:
求∑∑((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...