codevs 2606 约数和(分块优化数学公式 )

时间:2021-08-13 05:18:23

题目背景

Smart最近沉迷于对约数的研究中。

题目描述

对于一个数X,函数f(X)表示X所有约数的和。例如:f(6)=1+2+3+6=12。对于一个X,Smart可以很快的算出f(X)。现在的问题是,给定两个正整数X,Y(X<Y),Smart希望尽快地算出f(X)+f(X+1)+……+f(Y)的值,你能帮助Smart算出这个值吗?

输入输出格式

输入格式:

输入文件仅一行,两个正整数X和Y(X<Y),表示需要计算f(X)+f(X+1)+……+f(Y)。

输出格式:

输出只有一行,为f(X)+f(X+1)+……+f(Y)的值。

输入输出样例

输入样例#1: 复制
2 4
输出样例#1: 复制
14
输入样例#2: 复制
123 321
输出样例#2: 复制
72543

说明

对于20%的数据有1≤X<Y≤105。

对于60%的数据有1≤X<Y≤1*107。

对于100%的数据有1≤X<Y≤2*109。

解题思路:首先我们定义一个F(x)=Σf(i)(i=1~x),所表示的是1-x的约数和,那么我们要求的答案即可表示成F(y)-F(x-1),现在的问题是对于任意x怎么求出F(x),我们知道对于任意一个数x在区间[1,n]中将会有n/x个数是x的倍数,所以我们就可以得到F(x)=Σi*(n/i) (i=1-x),我们可以举个例子:

例如:x=6;

由题目定义函数f(X)表示X所有约数的和

f(1)=1;

f(2)=1+2;

f(3)=1+3;

f(4)=1+2+4;

f(5)=1+5;

f(6)=1+2+3+6;

F(6)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)=1*6+2*3+3*2=4*1+5*1+6*1,我们就可以发现对于每个约数i,其对应的系数为x/i。

不过我们可以很容易发现这种做法的复杂度为O(y),而y的范围为1≤Y≤2*109,这样做肯定是超时的,所以我们必须想办法对我们的公式进行优化,又由公式F(x)=∑(⌊x/i​⌋∗i) (其中i=1~x) ,我们经过分析会发现由于x/i向下取整的特性,会导致有连续多个i对应x/i的值相同,我们可以举个例子:

对于当x=12,F(12)来说:

约数i:             1        2    3    4    5   6   7    8    9    10    11    12

对应系数x/i:      12      6    4    3   2   2    1    1    1     1      1      1

对于刚才的思路我们是直接枚举求和即F(12)=1*12+2*6+3*4+4*3+5*2+6*2+7*1+8*1+9*1+10*1+11*1+12*1,而这必定也会超时的。

但是由上面列举的情况我们可以发现,对于同一个系数,出现多个i值时,这些i的值时成等差数列的,对于该部分我们可以把它看成是一块,即采用分块思想,该部分我们可以直接采用等差求和公式O(1)便可得出结果,即假设约数i=l到i=r,其对应的系数x/i都为同一个值时,该部分对答案的贡献值为(r-l+1)*(l+r)/2再乘对应权值即x/i;采用这种思路的话,上面的例子我们的计算方法就变成

F(12)=12*(1-1+1)*(1+1)/2+6*(2-2+1)*(2+2)/2+4*(3-3+1)*(3+3)/2+3*(4-4+1)*(4+4)/2+2*(6-5+1)*(5+6)/2+1*(12-7+1)*(7+12)/2;

当n很大时,这样便可以大大提高算法的效率了。

不过对上面公式中出现的l和r怎么求呢?l比较好求,观察上面的数列,每计算一次l就变成上一个r加1,初始l=1。

而对于r,r=x/(x/l);其中x/l表示的是系数,我们需要找到一个最大的数r使得x/r=x/l,即r=x/(x/l),例如例子中l=7时,我们需要找到一个最大的数r使得12/r=12/7,所以r=12/(12/7);

这样我们的思路就理顺了,

首先初始化l=1,r=0,ans=0,

计算r的值r=x/(x/l);

利用等差求和公式求系数为x/i的约束对答案的贡献,即ans+=(x/l)*(r-l+1)*(r+1)/2;

l=r+1,进入下一块区域。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxn=1e6+;
int n,q,m,r,tot,time;
LL cal(LL x){
LL l=,r=,ans=;
while(l<=x){
r=x/(x/l); //计算这块的右边界
ans+=(x/l)*(r-l+)*(l+r)/; //答案加上系数为x/l的块的贡献值 等差求和
l=r+;
}
return ans;
}
int main(){
LL x,y;
cin>>x>>y;
cout<<cal(y)-cal(x-)<<endl;
return ;
}

codevs 2606 约数和(分块优化数学公式 )的更多相关文章

  1. codevs 2606 约数和问题 (数学&plus;分块)

    题目描述 Description Smart最近沉迷于对约数的研究中. 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X) ...

  2. 洛谷P2424&sol;codevs 2606 约数和

    http://codevs.cn/problem/2606/ https://luogu.lohu.info/problem/show?pid=2424 题目背景 Smart最近沉迷于对约数的研究中. ...

  3. codevs 2606 约数和问题

    题目描述 Description Smart最近沉迷于对约数的研究中. 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X) ...

  4. bzoj 2301 &lbrack;HAOI2011&rsqb;Problem b(莫比乌斯反演&plus;分块优化)

    题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤50000, ...

  5. HDU5780 gcd &lpar;BestCoder Round &num;85 E&rpar; 欧拉函数预处理——分块优化

    分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...

  6. BZOJ 2301 Problem b(莫比乌斯反演&plus;分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  7. BZOJ 2301 Problem b&lpar;莫比乌斯反演&plus;分块优化&rpar;

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  8. &lbrack;bzoj2301&rsqb;Problem b莫比乌斯反演&plus;分块优化

    题意: $\sum\limits_{\begin{array}{*{20}{c}}{a < = x < = b}\\{c < = y < = d}\end{array}} {\ ...

  9. Codeforces 1129D - Isolation(分块优化 dp)

    Codeforces 题目传送门 & 洛谷题目传送门 又独立切了道 *2900( 首先考虑 \(dp\),\(dp_i\) 表示以 \(i\) 为结尾的划分的方式,那么显然有转移 \(dp_i ...

随机推荐

  1. WCF Misconfiguration&colon; Insufficient Audit Failure Handling

    Abstract: The program is configured not to generate an exception when it fails to write to an audit ...

  2. 生成短链&lpar;网址&rpar; ShortUrlLink

    建表 CREATE TABLE [dbo].[ShortUrl]( [Id] [,) NOT NULL, [LongUrl] [nvarchar]() NOT NULL, [BaseUri] [int ...

  3. ListView列表项

    方法,在xml文件中添加一个ListView,然后在MainActivity中 private ListView listView; private ArrayAdapter<String&gt ...

  4. bzoj 1570&colon; &lbrack;JSOI2008&rsqb;Blue Mary的旅行

    Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...

  5. Servlet--传参和接参

    OK,现在基本的Servlet接口和常用类都整理的差不多的,本篇博客开始整理Servlet和页面的交互. 1,接参 以下几个常用的方法: getParameter public String getP ...

  6. nginx指令中的优化(配置文件)

    nginx指令中的优化(配置文件)worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数.worker_cpu_affinity 00000001 0000 ...

  7. Couldn’t load locSDK3

    在项目的libs目录下新建一个文件夹,命名为armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹 ok

  8. jqGrid 中的editrules来自定义colModel验证规则

    editrules    editrules是用来设置一些可用于可编辑列的colModel的额外属性的.大多数的时候是用来在提交到服务器之前验证用户的输入合法性的.比如editrules:{edith ...

  9. Appium&plus;python自动化6-Remote远程控制

    前言 在第三篇启动app的时候有这样一行代码driver = webdriver.Remote('http://192.168.1.1:4723/wd/hub', desired_caps),很多小伙 ...

  10. 09-spring学习-资源访问接口

    目标: 1,掌握Resource接口的使用. 2,掌握ResourceLoader接口的使用. 3,掌握各种资源数据的读取操作. 具体内容: 要想进行资源读取操作,首先想到IO包中提供的操作类. 但是 ...