【BZOJ-2956】(清华集训2012)模积和

2019-04-14 21:50发布

题目链接

题目描述

((nmodi)(mmodj))1<=i<=n,1<=j<=m,ij" role="presentation" style="position: relative;">((nmodi)(mmodj))1<=i<=n,1<=j<=m,ij。 例如对于 n=3,m=4 :
答案为(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 mod 2) * (4 mod 3) + (3 mod 2) * (4 mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4) = 1

题解

可以先去做做余数求和 ,我的题解。 一开始看漏了ij" role="presentation" style="position: relative;">ij,以为这和余数求和一样…
但是既然又和取模的和有关,与余数求和的思想是差不多的。
我们有amodb=afloor(a/b)b" role="presentation" style="position: relative;">amodb=afloor(a/b)b
于是我们再来推一波式子:
i=1nj=1,jim((nmodi)(mmodj))" role="presentation">i=1nj=1,jim((nmodi)(mmodj))
=((nmodi)(mmodj))i=1min(n,m)((nmodi)(mmodi))" role="presentation" style="position: relative;">=((nmodi)(mmodj))i=1min(n,m)((nmodi)(mmodi)) 前面那段就是余数求和的方法,不多讲,我们来看后面一段。
不妨设nm" role="presentation" style="position: relative;">nm
那么:
i=1n((nmodi)(mmodi))" role="presentation" style="position: relative;">i=1n((nmodi)(mmodi))
=((nn/ii)(mm/ii))" role="presentation" style="position: relative;">=((nn/ii)(mm/ii))
n/i=x,m/i=y" role="presentation" style="position: relative;">n/i=x,m/i=y
原式化为:
(mnmxinyi+xyi2)" role="presentation" style="position: relative;">(mnmxinyi+xyi2)
(mn+xyi2(mx+ny)i)" role="presentation" style="position: relative;">(mn+xyi2(mx+ny)i) 到这里式子已经推的差不多了。
我们发现可以对x,y" role="presentation" style="position: relative;">x,y进行除法分块,且前面的mn可以预先处理掉。
于是我们着眼于求出一个块内的(xyi2(mx+ny)i)" role="presentation" style="position: relative;">(xyi2(mx+ny)i)
假定当前块内