洛谷 P2424 约数和
来源:互联网 发布:linux vi 搜索关键字 编辑:程序博客网 时间:2024/06/08 16:20
时空限制
1s / 128MB
题目背景
Smart最近沉迷于对约数的研究中。
题目描述
对于一个数X,函数
输入输出格式
输入格式:
输入文件仅一行,两个正整数
输出格式:
输出只有一行,为
输入输出样例
输入样例#1:
2 4
输出样例#1:
14
输入样例#2:
123 321
输出样例#2:
72543
说明
对于
对于
对于
solution
把
f(x) 用数学方式表示一下就是f(x)=∑d|xd 那
ans=∑i=xyf(i)=∑i=xy∑d|id 那我们就可以直接枚举然后累加就可以了。
但这样的时间复杂度是
O(∑i=xyi√) ,会TLE 所以换一种思路,枚举约数
考虑
1−n 中有几个数是d 的倍数假如
1−n 中存在d 的倍数,那这个数肯定可以表示为k⋅d(k∈N+) k 的范围可以再简化一下,1≤k⋅d≤n⇒1≤k≤⌊nd⌋ 也就是说从
1−n 中把d 的倍数单独拿出来,那就是d,2d,3d.....⌊nd⌋d 所以
1−n 中d 的倍数的个数就是⌊nd⌋ 求出
y 的个数,再减去x−1 的个数,也就是x−y 的个数,这个是比较好想的,所以我就不详细说了。这样
∑i=1nf(i) 就可以表示为∑i=1n(⌊ni⌋∗i) 那
ans=∑i=1y(⌊yi⌋∗i)−∑i=1x−1(⌊x−1i⌋∗i) 这种做法时间复杂度是
O(y) ,还是会TLE 再看
∑i=1n(⌊ni⌋∗i) 只看
⌊ni⌋ ,胡乱找个数列出来⌊ni⌋(1≤i≤n) 的值以
12 为例,列出来是12,6,4,3,2,2,1,1,1,1,1,1 ,第i 个数表示⌊ni⌋ 的值发现这里面有些数是重复的,考虑能不能把这些重复的一次算出来
把那些相同的值用区间来表示,那只要求出左右端点
l,r 来就好了l 比较好求,观察上面的数列,l 就是上一个r 加1 ,初始l=1 那
r 怎么求呢?其实很简单r=n/(n/l) l 是那个数列的下标,所以(n/l) 就是约数,那r 就显然了,如果不知道为什么,那就再看一遍“1−n 中有几个数是d 的倍数”。l 和r 都知道了, 那答案呢?ans+= 约数*约数的个数- 约数
=n/l 约数的个数
=∑i=lri ,用等差数列求和公式表示一下就是(l+r)∗(r−l+1)/2 即
ans+=(n/l)∗(l+r)∗(r−l+1)/2 然后就愉快的AC啦!
code
比题解不知道短到那里去的代码
#include<cstdio>using namespace std;typedef long long ll;ll sum(int n) { if(n<=1) return n; ll ans=0; for(ll l=1,r;l<=n;l=r+1) { r=n/(n/l); ans+=(n/l)*(l+r)*(r-l+1)/2; } return ans;}int main() { int x,y; scanf("%d%d",&x,&y); printf("%lld\n",sum(y)-sum(x-1)); return 0;}
- 洛谷 P2424 约数和
- 洛谷 P2424 约数和
- P2424 约数和
- 洛谷P1734 最大约数和
- 约数个数及约数和
- 约数个数定理 和 约数和定理
- 约数个数定理and约数和定理
- 线性筛 [约数个数/约数和]
- wikioi 1396 约数和
- POJ 1845 约数和
- poj1845Sumdiv+约数和定理
- n的约数和
- [bzoj3994]约数个数和
- uva11728-约数的和
- 最大约数和
- 约数和定理
- 整数的约数和
- 约数和问题 (codevs2606 && 洛谷2424)
- 炼数成金优惠码
- 用SQL数据库做多表关联应怎样设计库结构
- Android 中线程和线程池
- Oracle 简单介绍
- github与git链接问题
- 洛谷 P2424 约数和
- TP5 在模板读出数据
- codeforces 863F Almost Permutation
- 字节流与字符流的区别详解
- 工作日常记录 2017-09-22
- 【python+autohotkey】优雅地在markdown中插入图片
- Linux安装mysql
- TCP/IP的原理与介绍
- [SDUT](2088)refresh的停车场 ---栈和队列