class="markdown_views prism-atom-one-light">
题目链接:
bzoj2956
题目大意:
求
∑ni=1∑mj=1(nmodi)×(mmodj),i≠j
题解:
数论+分块
看清题啊
i≠j!
所以式子就变成:
∑i=1n∑j=1m(nmodi)×(mmodj)−∑i=1min(n,m)(nmodi)×(mmodj)
像
bzoj1257那样处理
于是就变成了:
∑i=1n∑j=1m(n−i×⌊ni⌋)×(m−j×⌊mj⌋)−∑i=1min(n,m)(n−i×⌊ni⌋)×(m−j×⌊mj⌋)
傻傻的我把两边都拆开直接搞了。
于是对于
∑ni=1∑mj=1i×j×⌊ni⌋×⌊mj⌋表示打了个
O(n√m−−√)的…诶好蠢啊ww
应该把式子化成:
∑i=1n(n−i×⌊ni⌋)∑j=1m(m−j×⌊mj⌋)−∑i=1min(n,m)(n−i×⌊ni⌋)×(m−j×⌊mj⌋))
这样前面的就可以把
n、
m提出来之后像bzoj1257那样分块搞,后半式的话拆开之后也是类似的,用分块来做(像
bzoj2301那样)。
总结:
有时可以考虑内外层求和对调啊
还有分块的套路要熟悉。要有意识看到
⌊ni⌋、
⌊ni⌋×⌊mj⌋之后用分块啊
话说,这题mod得我真恶心,因为mod得不够多WA了两三次!
using namespace std;
typedef long long LL;
const LL ny=