题目描述
有句老话说“一口春膳桃花酥,美如人间四月天”。
不知不觉春天来了,三月是桃花盛开的季节,赏桃花的同时来一份桃花酥,简直是太棒了。桃花酥是我们的传统糕点之一,桃花酥外皮酥脆香甜,内陷细腻软绵。
每到春天,RT都会做一些桃花酥打算在桃花节上售卖,今年RT想到了一个新的售卖方式,规则如下;
RT把桃花酥放在带有连续编号的盒子里,每个人只能购买从盒子X到盒子Y的所有盒子,盒子从0开始编号; 每个盒子里面装的桃花酥数量是盒子编号的约数和;
给定起始盒子的编号和结束盒子的编号,求本次购买可以买到总共多少个桃花酥呢?
输入
输入两个数字 X,Y,表示起始盒子编号和结束盒子编号,(0≤X,Y≤2×109)
输出
输出一个结果,可以买到的桃花酥数量
样例输入
0 1
样例输出
1
提示
思路分析
由题意得,要求x到y的(包含x和y)之间所有数的约数和;根据公式的提示,不难发现,先求0到x(不含x)之间所有数的约数和,再求0到y(含y)之间所有数的约数和,然后由后者减去前者即为最终结果。
样例分析
如y=4;要求1到4(含4)之间所有数的约数和;
1的约数:1
2的约数:1 、2
3的约数:1 、3
4的约数:1 、2、4
约数和中:
含y/1个1,含y/2个2,含y/3个3,含y/4个4;
注意: / 左右两边为整形数据,运算结果为整数!
相关代码
#include <stdio.h>
main()
{
long long x,y,a=0,b=0,i;
scanf("%lld%lld",&x,&y);
x--;
if(x<2)a=0;//求0到x(不含x)的所有约数和;
else{
for(i=1;i<=x;i++){
a+=x/i*i;
}
}
for(i=1;i<=y;i++){//求0到y(含y)的所有数据的约数和;
b+=y/i*i;
}
printf("%lld\n",b-a);
return 0;
}