【BZOJ】2956:模积和
Time Limit: 10 Sec Memory Limit: 128 MB
Description
求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。
Input
第一行两个数n,m。
Output
一个整数表示答案mod 19940417的值
Sample Input
3 4
Sample Output
1
样例说明
答案为(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
数据规模和约定
对于100%的数据n,m<=10^9。
这里是链接:【BZOJ】2956:模积和
这里是题解:
首先,暴力枚举将会很凄惨:O(nm)。早就 GG ( Time Limit Exceeded )了。
所以从公式入手:原公式是:
展开为:
观察式子:[n mod i](同理 m mod j)
根据mod的定义可以将上式写成这个样子:
[n/i]向下取整,就是C++中的整型(n/i),然后再乘以 i 就相当于下图灰色区域,
再用n减掉就能得到mod后的值。【下图模拟mod的转化】

所以式子就可以简化为:
【注意:因为题目中i!=j,所以当i、j 相同就直接减掉】

然而这样还是O(n^2)的复杂度。
所以继续化简:将第一个式子的Σ移动,使时间复杂度变为O(n)。
这里是最终式子:

能够移动Σ的证明:设n-[n/i]*i为Xi,m-[m/j]*j为Yj。
(下图有点错误:n、m的值应该是不同的,但是n、m不同的证明也是这样的。)
这个是原式子展开的ans:

这个是化简后展开的ans:

显然它们的ans值是相等的。那么,第一步化简式子已经完成了。
虽然移动Σ已经将复杂度降低到O(n),但很不幸的是依然过不了。
考虑如何优化:
低于O(n)的复杂度一般就三种:O(1)、O(logn)、O(√n)。
注意最终式子,都有一个式子like this:[n/i](其中n为一个定值,i是从1到n的一个变量。)
但是这里有个很美妙的事情就是:
假如n==1000时,i在91~100之间,n/i的值都是为10的;
假如n==100000000时,i在9090910~10000000之间,n/i的值都是为10的。
这里因为在某一个区间中的值都是相等的。所以我们可以很愉快地利用分块的思想。
那么怎么算这个块的大小呢?
假设有一个块里面的[n/i]的值都是为k,那么其区间就是:[(n/(k+1))+1,n/k].
推导:因为[n/i]是向下取整的,所以k*i<=n,n/k为定值,所以i<=n/k,但i一定也有下界,所以i>n/(k+1),
即i>=n/(k+1)+1.
注意:分块求值套用公式的时候需要除法,并不能先取模,然而不先取模会爆long long.
但好在除的数是固定的6,所以就直接在求平方和的时候,MOD开大6倍,最后再模回去就行了。
(其实反过来也就是网上普遍流传的3323403,是[mod/6]的值)
这里是代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define LL long long
#define mod 19940417
#define MOD 119642502
using namespace std;
LL n,m,tmp1,tmp2,ans,ine; LL sum(LL x){
return x*(x+)/%mod;
} LL SUM(LL x){
return x*(x+)%MOD*(*x+)%MOD/;
} LL calc(LL x){
LL ans=x*x%mod;
for(LL i=;i<=x;i=tmp1+){
tmp1=x/(x/i);//(x/i)求k的值,n/k为块的上界
ans=(ans-(x/i)*(sum(tmp1)-sum(i-)+mod)%mod)%mod;
}
return ans%mod;
} int main(){
scanf("%lld %lld",&n,&m);
if(n>m) swap(n,m);
ans=calc(n)*calc(m)%mod;
//处理i,j相同情况
for(LL i=;i<=n;i=tmp2+){
tmp2=min(n/(n/i),m/(m/i));
ans=(ans-n*m%mod*(tmp2-i+)%mod
+m*(n/i)%mod*(sum(tmp2)-sum(i-)+mod)%mod
+n*(m/i)%mod*(sum(tmp2)-sum(i-)+mod)%mod
-(n/i)*(m/i)%mod*(SUM(tmp2)-SUM(i-)+mod)%mod+*mod)%mod;
}
printf("%lld",ans%mod);
return ;
}
【BZOJ】2956
梦想总是要有的,万一实现了呢?
【BZOJ】2956:模积和的更多相关文章
- BZOJ 2956 模积和 (数学推导+数论分块)
手动博客搬家: 本文发表于20170223 16:47:26, 原地址https://blog.csdn.net/suncongbo/article/details/79354835 题目链接: ht ...
- BZOJ 2956 模积和
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2956 题意:给出n和m.计算: 思路: i64 n,m; i64 cal(i64 m,i ...
- [Bzoj 2956] 模积和 (整除分块)
整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...
- BZOJ 2956 模积和(分块)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2956 [题目大意] 求∑∑((n%i)*(m%j))其中1<=i<=n,1 ...
- bzoj 2956: 模积和 ——数论
Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...
- 【BZOJ】2956: 模积和
题意 求\(\sum_{i=1}^{n} \sum_{j=1}^{m} (n \ mod \ i)(m \ mod \ j)[i \neq j] \ mod \ 19940417\), \((n, m ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...
- BZOJ_2956_模积和_数学
BZOJ_2956_模积和_数学 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数 ...
- P2260 [清华集训2012]模积和
P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...
随机推荐
- Entity Framework中执行Sql语句
如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本). EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...
- JAVA高级之路----JAVA多线程
介绍 这段时间一直在学习和整理一些通往java高级程序猿必备的知识点,有些是工作中必须要知道的,有些是面试必须要知道的, 但是不管怎么样,学习了就不会有坏处,不可能全部记得住,最起码得雁过留痕,知识不 ...
- Ubuntu设置DNS服务
有时候安装完Ubuntu系统,源换好好还是不能更新,软件也不能下, 配置好IP,ping 1.1.1.1是通的,ping 域名就不通了,这是没有DNS解析域名的结果 一.Server版: 对于Ubun ...
- Charles的安装与破解
Charles启动需要安装java环境,不知配置了jdk就可以,而是需要java环境,否则下载后点击启动会提示找不到suitable java 1 安装java环境 安装java环境是在https:/ ...
- 原生WebGL场景中绘制多个圆锥圆柱
前几天解决了原生WebGL开发中的一个问题,就是在一个场景中绘制多个几何网格特征不同的模型,比如本文所做的绘制多个圆锥和圆柱在同一个场景中,今天抽空把解决的办法记录下来,同时也附上代码.首先声明,圆柱 ...
- socket编程为什么需要htonl(), ntohl(), ntohs(),htons() 函数-------转载
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- Python3实现机器学习经典算法(二)KNN实现简单OCR
一.前言 1.ocr概述 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然 ...
- rhel6 mysql skip-grant-tables 添加用户报错 ERROR 1290
不小心把数据库密码忘掉了, 这个时候我们只需要在数据库的配置文件里面添加 skip-grant-tables 然后重新启动服务,再登录数据库就不要我们输入密码了 这个时候我成功登录数据,可是不小心又把 ...
- Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 20181023-10 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 07
作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2290 Scrum master:范靖旋 一.小组介绍 组长:王一可 组员: ...