C - Fear Factoring Gym - 101615C(求约数和,除法分块)

2024-04-16 02:38

本文主要是介绍C - Fear Factoring Gym - 101615C(求约数和,除法分块),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem C — limit 1 second
Fear Factoring
The Slivians are afraid of factoring; it’s just, well, difficult.
Really, they don’t even care about the factors themselves, just how much they sum to.
We can define F(n) as the sum of all of the factors of n; so F(6) = 12 and F(12) = 28. Your task is, given two integers a and b with a ≤ b, to calculate
S= ? F(n). a≤n≤b
Input
The input consists of a single line containing space-separated integers a and b (1 ≤ a ≤ b ≤ 1012; b − a ≤ 106).
Output
Print S on a single line.
Sample Input and Output

101 101
102
28 28
56
1 10
87
987654456799 987654456799
987654456800
2017 Pacific Northwest Region Programming Contest 9
963761198400 963761198400
5531765944320
5260013877 5260489265
4113430571304040

推荐阅读:https://www.luogu.com.cn/blog/KingofNight/post-shuo-lun-zheng-shuo-fen-kuai-ji-yang-xi-zheng-ming
题意: a~b直接所有数的约数和。
我们要求得是 ∑[n/i] X i。但是n太大了,枚举i不可能。注意到,每一个连续块的n/i数目是相同的,只要我们找到这个数目相同块的左边界和右边界,就可以一块一块的求了。

左边界就是上一次的边界+1,右边界呢?
假设有 n / a = b n / a = b n/a=b
假设 r = n / ( n / a ) = n / b r = n / (n / a) = n / b r=n/(n/a)=n/b
如果 r ∗ b = x − k r*b = x -k rb=xk,那么 k < b k<b k<b
那么有结论 n / r = b n / r = b n/r=b
证明:
r ∗ b = n − k , k < r r*b=n-k,k<r rb=nk,k<r
那么 r = ( n − k ) / b r=(n-k)/b r=(nk)/b
那么 n / r = b n / ( n − k ) ≥ b n/r=bn/(n-k)≥b n/r=bn/(nk)b

假设 n / r ≥ b + 1 n/r≥b+1 n/rb+1
那么 n ≥ r ∗ b + r n≥r*b+r nrb+r
那么 r ∗ b ≤ n − r r*b≤n-r rbnr
又因为 r ∗ b = n − k , k < r r*b=n-k,k<r rb=nk,k<r
得到 k ≥ r k≥r kr,与已知矛盾,故不成立

所以 b ≤ n / r < b + 1 b≤n/r<b+1 bn/r<b+1
所以 n / r = b n/r=b n/r=b

又可以有结论 r 是最大的使得x/a=b的a。
证明: 假设 r 不是最大的使得x/a=b的a,
那么 x / ( r + 1 ) = b x / (r+1) = b x/(r+1)=b
那么 ( r + 1 ) ∗ b = x − g , g < r , b (r+1)*b = x - g, g < r,b (r+1)b=xg,g<r,b
那么 r ∗ b + b = x − g r*b+b=x-g rb+b=xg,即 x − k + b = x − g x-k+b=x-g xk+b=xg
那么 k − g = b k-g=b kg=b
与已知矛盾,故r是足底啊的使得x/a=b的a.

所以b对应的是n / a = b的最大的a。那么右边界就是 n / (n / l) + 1。

#include <cstdio>using namespace std;typedef unsigned long long ll;ll cal(ll n)
{ll j = 0,ans = 0;for(ll i = 1;i <= n;i = j + 1){j = n / (n / i);//n/i为约数i的数目,n / (n/i)代表着约数数目为n/i的右边界。ans += (i + j) * (j - i + 1) * (n / i) / 2;}return ans;
}int main()
{ll a,b;scanf("%lld%lld",&a,&b);printf("%lld\n",cal(b) - cal(a - 1));return 0;
}

这篇关于C - Fear Factoring Gym - 101615C(求约数和,除法分块)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907606

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

高精度打表-Factoring Large Numbers

求斐波那契数,不打表的话会超时,打表的话普通的高精度开不出来那么大的数组,不如一个int存8位,特殊处理一下,具体看代码 #include<stdio.h>#include<string.h>#define MAX_SIZE 5005#define LEN 150#define to 100000000/*一个int存8位*/int num[MAX_SIZE][LEN];void

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro

Spring Boot实现大文件分块上传

1.分块上传使用场景 大文件加速上传:当文件大小超过100MB时,使用分片上传可实现并行上传多个Part以加快上传速度。 网络环境较差:网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。 文件大小不确定: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。 2.实现原理 实现原理其实很简单,核心就是客户端把大文件

信息学奥赛初赛天天练-83-NOIP2014普及组-基础题2-输入设备、输出设备、操作系统、二进制、整数除法、while、do while循环

1 NOIP 2014 普及组 基础题2 4 以下哪一种设备属于输出设备( ) A 扫描仪 B 键盘 C 鼠标 D 打印机 5 下列对操作系统功能的描述最为完整的是( ) A 负责外设与主机之间的信息交换 B 负责诊断机器的故障 C 控制和管理计算机系统的各种硬件和软件资源的使用 D 将没有程序编译成目标程序 11 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( ) A 296

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

【HDU】5213 Lucky 【分块(在线算法)】

传送门:【HDU】5213 Lucky 题目分析: 我来说一下这题的在线做法。 首先我们将区间分成 n√ \sqrt n块,用f[x][y]表示第x块的数和第y块的数相加等于K的对数,这个可以 O(nn√) O(n \sqrt n)的预处理。然后还有g[x][y]表示在第1~x块中有的大小为y的数的个数,这个的复杂度同样 O(nn√) O(n \sqrt n)。 接下来,对于每组询问,我们

【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】

题目链接:【codeforces】gym 101137 K - Knights of the Old Republic 考虑对图集合dp,一个连通块的dp值为两个连通块的值的和或者强制加一条新边后的最小值,取个最小值(边从小到大枚举,则强制加一条最大的边会导致连通块内较小的边一定都选,则会构成一个生成树)。用kruskal实现这个dp过程即可。 #include <bits/stdc++.h>

【codeforces】gym 101138 K. The World of Trains【前缀和优化dp】

题目链接:K. The World of Trains 记录一个横着的前缀dp和以及斜着的前缀dp,复杂度 O(n2) O(n^2) #include <bits/stdc++.h>using namespace std ;typedef pair < int , int > pii ;typedef long long LL ;#define clr( a , x ) memset (

针对大数据的种子点生长——分块生长的策略

前言   在之前的种子点生长系列中,探讨了使用三种提取图像中内容部分种子点生长算法,分别是泛洪法、扫描线法和区段法。我们知道这三种算法在空间上都需要占用三维图像的空间以及相应的位图标记表的空间。有时,我们需要处理一些体积相当大的数据,这些数据都是内存中无法放下的,如数十数百GB的数据,想要获得其中图像内容信息,一般需要对图像进行分块生长。   本文使用一种比较直接的思路对数据进行分块,然