P2424 约数和

题目背景

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≤10^5。

对于60%的数据有1≤X<Y≤1*10^7。

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

这题卡了好久,题目很简单很好理解,可推公式的确是件棘手的事

首先想到的方法是用前缀和的思想,ans [l~r]=ans[1~r] – ans[1~l-1]

求1~n的约数和,用的是这种方法:

1:1/2=0           ans=1

2:2/2=1 2/3=0      ans=1*2+2=4

3:3/2=1 3/3=1 3/4=0 ans=1*3+1*2+3=8

4:4/2=2 4/3=1 4/4=1 ans=2*2+1*3+1*4+4=15

原理很明显

n除以一个数a,的数就是1~n这些数中以a为因数的数的个数,再乘以a,就是一个因数和

最后加上n是由于n本身是n的因数

可是糟糕,这种方法会超时,只得了60分

60分代码

#include<iostream>
using namespace std;
long long l,r,al,ar;
long long work(long long a){
long long result=;
for(long long i=;i<=a;i++){
if(a/i==)break;
result+=(a/i)*i;
}
result+=a;
return result;
}
int main(){
cin>>l>>r;
al=work(l-);
ar=work(r);
cout<<ar-al;
}

无计可施的我在这道题上崩溃了,心塞……

晚饭后,去找元元问这个题,才终于明白过来

这题思路是没毛病的,但是TLE的问题说明代码需要优化加速

用等差数列优化

首先根据之前的发现,以4为例,会发现4/3=1,4/4=1,同样的,在别的数字上也会出现类似的情况,而且数字越大,这种情况的出现越多,我把3,4分别叫做本例中情况的左右边界。而且不难发现这种情况的连续序列中因数都是等差的,差为一,所以可以直接利用等差数列求和

最后我发现,这个代码怎么写都丑。

等差数列求和公式

#include<iostream>
#include<cstdio>
using namespace std;
long long l,r;
long long work(long long x){
long long result=;
long long d=,b;//d是左边界,b是右边界
while(){
b=x/(x/d);
long long some=x/d;
result+=((b+d)*(b-d+)/)*some;
d=b+;
if(x/d==)break;
}
return result;
}
int main(){
cin>>l>>r;
long long al=work(l-);
long long ar=work(r);
cout<<ar-al;
}

约数和问题 (codevs2606 && 洛谷2424)的更多相关文章

  1. 【题解】洛谷P1463 [POI2002][HAOI2007] 反素数(约数个数公式+搜索)

    洛谷P1463:https://www.luogu.org/problemnew/show/P1463 思路 约数个数公式  ai为质因数分解的质数的指数 定理: 设m=2a1*3a2*...*pak ...

  2. 【题解】洛谷P1445 [Violet]樱花 (推导+约数和)

    洛谷P1445:https://www.luogu.org/problemnew/show/P1445 推导过程 1/x+1/y=1/n! 设y=n!+k(k∈N∗) 1/x​+1/(n!+k)​=1 ...

  3. 洛谷 P4902 乘积 (约数筛,前缀和(积))

    洛谷P4902乘积 题意简述: 给 $ t $ 组 $ (a,b) $ 求: $ \prod_{i=A}^{B}\prod_{j=1}^{i}(\frac{i}{j})^{\lfloor \frac{ ...

  4. LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)

    LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...

  5. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

  6. 洛谷P1120 小木棍

    洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...

  7. 洛谷4月月赛R2

    洛谷4月月赛R2 打酱油... A.koishi的数学题  线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...

  8. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  9. 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数

    洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...

随机推荐

  1. 获取原生的DOM方式,DIY脚手架,vue-cli的使用

    一 . 获取原生的DOM的方式 在js中,我们可以通过id, class 或者标签获取DOM元素,vue中也为我们提供了获取原生DOM的方法,就是给标签或者组件添加 ref 属性,通过 this.$r ...

  2. mysql服务突然不能启动

    mysql之前一直用的好好的,今天突然不能启动.前几天改过my.ini文件,在[mysqld]下添加了default-character-set=utf8.查看日志发现是添加的那句话的错误,删除.并且 ...

  3. BZOJ 3083 遥远的国度 树链剖分+线段树

    有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...

  4. 《CSS权威指南(第三版)》---第二章 选择器

    本章的主要内容是,怎么获取文档中的元素给予渲染: 1.元素选择器: 2.ID选择器: 3.CLSSS选择器: 4.通配选择器:*; 5.属性选择器:selector[] 6.部分属性选择器: sele ...

  5. 用vector代替实现二维数组

    vector可以用来模拟数组,当然也可以用来模拟二维数组: 定义如:vector<int>a[100];   相当于定义了一个100行的数组,当每行的大小是不确定的 模板应用如下: #in ...

  6. kvm初体验之八:调整vm的vcpu, memory, disk大小

    假设host上创建的vm的名字为vm1. 1. 查看vm1的domain information [root@tanghuimin thm]# virsh dominfo vm1 Id: 10 Nam ...

  7. 使用谷歌浏览器进行Web开发技巧

    1.为了避免缓存影响开发,使用使用那个“Ctrl+Shift+N”进入浏览器的隐身模式

  8. 前端多媒体(2)—— xhr异步接收处理二进制数据

    有时我们需要把远程的视频.图片数据异步下载下来,然后在js里进行特殊处理.比如把VR的图片特殊处理,把不同封装格式的视频做一次 转封装 处理等等,这类操作都要先获取二进制数据,然后特殊处理. 这个时候 ...

  9. POJ3237 Tree(树剖+线段树+lazy标记)

    You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...

  10. bzoj 4503 两个串 快速傅里叶变换FFT

    题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...