BZOJ2956: 模积和——整除分块
题意
求 $\sum_{i=1}^n \sum_{j=1}^m (n \ mod \ i)*(m \ mod \ j)$($i \neq j$),$n,m \leq 10^9$答案对 $19940417$ 取模。
分析:
由于取模可化成取整的形式,$k \ mod \ i = k - \left \lfloor \frac{k}{i} \right \rfloor * i$,详见BZOJ1257 余数之和。
易知,$\sum_{i=1}^n \sum_{j=1}^m (n \ mod \ i)*(m \ mod \ j) = \sum_{i=1}^n(n \ mod \ i)\sum_{j=1}^m(m \ mod \ j)$
所以答案为两部分余数和的乘积减去 $i$ 等于 $j$ 的情况,
当 $i=j$ 时,
$$
\begin{aligned}
\sum_{i=1}^{min(n,m)}(n \ mod \ i)(m \ mod \ i) & = \sum_{i=1}^{min(n,m)}(n - \left \lfloor \frac{n}{i} \right \rfloor i)(m - \left \lfloor \frac{m}{i} \right \rfloor i) \\
&= \sum_{i=1}^{min(n,m)}(nm - m\left \lfloor \frac{n}{i} \right \rfloor i - n\left \lfloor \frac{m}{i} \right \rfloor i + \left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{i} \right \rfloor i^2) \\
\end{aligned}$$
代码:
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = ;
const ll inv6 = ;
ll n, m; //\sum_1^n [k/i]*i
ll S1(ll n, ll k)
{
ll ret = ;
if(k <= n) //需要分类讨论
{
for(ll i = ,j;i <= k;i = j+)
{
j = k / (k / i); ret = (ret + (i+j) * (j-i+) / % mod * (k / i) % mod) % mod;
}
}
else
{
for(ll i = ,j;i <= n;i = j+)
{
j = min(k / (k / i), n);
ret = (ret + (i+j) * (j-i+) / % mod * (k / i) % mod) % mod;
}
} return ret;
} ll S2(ll n)
{
n %= mod;
return n * (n+) % mod * (*n+) % mod * inv6 % mod;
} //[n/i][m/i]i^2
ll S3(ll n, ll m)
{
ll ret = ;
for(ll i = ,j;i <= min(n, m);i = j+)
{
j = min(n/(n/i), m/(m/i));
ret = (ret + (n/i) * (m/i) % mod * (S2(j) - S2(i-)) % mod) % mod;
}
return ret;
} int main()
{
scanf("%d%d", &n, &m);
if(m > n) swap(n, m);
ll ans = ;
ans = ans * (n*n%mod - S1(n, n) + mod) % mod;
ans = ans * (m*m%mod - S1(m, m) + mod) % mod;
ll ans2 = n *m % mod * m % mod;
ans2 = (ans2 - m * S1(m, n) % mod) % mod;
ans2 = (ans2 - n * S1(m, m) % mod) % mod;
ans2 = (ans2 + S3(n, m)) % mod;
//printf("%lld %lld\n", ans, ans2);
printf("%lld\n", (ans - ans2 + *mod) % mod);
return ;
}
参考链接:https://www.cnblogs.com/henry-1202/p/10201032.html
BZOJ2956: 模积和——整除分块的更多相关文章
- [Bzoj 2956] 模积和 (整除分块)
整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...
- BZOJ2956: 模积和(数论分块)
题意 题目链接 Sol 啊啊这题好恶心啊,推的时候一堆细节qwq \(a \% i = a - \frac{a}{i} * i\) 把所有的都展开,直接分块.关键是那个\(i \not= j\)的地方 ...
- 【数论分块】bzoj2956: 模积和
数论分块并不精通……第一次调了一个多小时才搞到60pts:因为不会处理i==j的情况,只能枚举了…… Description $\sum_{i=1}^{n}\sum_{j=1 \land i \not ...
- BZOJ2956: 模积和
Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...
- bzoj2956: 模积和(数论)
先算出无限制的情况,再减去i==j的情况. 无限制的情况很好算,有限制的情况需要将式子拆开. 注意最后的地方要用平方和公式,模数+1是6的倍数,于是逆元就是(模数+1)/6 #include<i ...
- BZOJ 2956 模积和(分块)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2956 [题目大意] 求∑∑((n%i)*(m%j))其中1<=i<=n,1 ...
- ACM学习历程—BZOJ2956 模积和(数论)
Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...
- P2260 [清华集训2012]模积和
P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...
- 【BZOJ2956】模积和 分块
[BZOJ2956]模积和 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m ...
随机推荐
- redhat与zlib兼容性问题?
今天在redhat 6.3 x64版本上安装了zlib,安装完后可以正常使用,就是发现gedit使用有点异常——无法启动,当时也没在意,但是后来重启电脑后出现桌面背景图片后就不弹出登陆窗口了,但是进命 ...
- nvidia jetson tx2 刷机遇到的问题解决
一.主要信息 使用的开发板:nvidia jetson tx2(内存8g有wifi的版本) 使用的JetPack版本: 4.2.2 二.遇到的问题及解决 1. 刷好jetson os 后,开发板一直在 ...
- [转帖]负载均衡 LVS+Keepalived
负载均衡 LVS+Keepalived https://www.cnblogs.com/jicki/p/5546862.html 改天试试 一直没搞过. 系统 CentOS 5.6 X64 物理机 ...
- [转帖]年经贴: ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器?
ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器? https://www.cnbeta.com/articles/tech/899421.htm . 之前苹果的哥们说过 谁特别在意自己的软 ...
- python爬虫-爬取你想要的小姐姐
一.准备 1. 原地址 2. 检查html发现,网页是有规则的分页, 最大图片的class为pic-large 二.代码 import requests import os from bs4 impo ...
- python 之 面向对象(多态性、装饰器方法 内置函数补充)
7.6 多态性 1 什么是多态性 多态指的是同一种事物多种形态,在程序中用继承可以表现出多态.多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法 2.为什要用多态 用基类创建一套统一的规 ...
- eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass method 在做arcgis android开发的时候,突然遇到这种错误,The method onClick(View) of type new View.OnClickListener(){} mus
eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass met ...
- Ubuntu 利用 mtd-utils 制作ubifs.img
确保已经安装了有关的工具 sudo apt-get install mtd-utils mkfs.ubifs -d fs -m -o rootfslink.ubiimg -e -c -F -v syn ...
- ubuntu修改密码
ubuntu修改密码 本文链接:https://blog.csdn.net/heybob/article/details/9095727 修改root密码: 1,$sudo su,输入密码进入root ...
- Bipartite Checking CodeForces - 813F (线段树按时间分治)
大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...