SHLQSH数
第一题 SHLQSH数
(shlqsh.pas/c/cpp)
【问题描述】
我们把t1 , t2 (包括t1 , t2 (1<=t1<t2<=10000000))之间的所有数的约数个数和n称为t1 , t2的shlqsh数;
问题是给出数据t1 , t2后,求t1 , t2的shlqsh数;
【输入格式】
输入文件 shlqsh.in 仅包含一行,共有两个整数,表示t1 t2 (用空格分开)
【输出格式】
输出文件shlqsh.out 仅有一个整数,表示t1 , t2之间的shlqsh数。
【输入样例】
2 6
【输出样例】
13
样例说明:(说明部分不必输出)
2的约数有1,2 (2个);
3的约数有1,3 (2个);
4的约数有1,2,4 (3个);
5的约数有1,5 (2个);
6的约数有1,2,3,6 (4个)。
所以2 6 的shlqsh数为13
【数据规模】
对于50 %的数据,保证有t1,t2<=5000000
对于全部的数据,保证有t1,t2<=10000000
【问题分析】
我们先来考虑这样一个问题:
求n及以下的所有正整数中能整除I(1<=I<=n)的数的数的个数;
是不是可以考虑用 n div I呢? 是的。
那我们枚举I (1..n) ,把n div I累加到临时变量tot中,得到了什么?
得到了n及以下所有数的约数的个数的和。
例如:当n=6时;
begin
tot:=0;
for I:=1 to n do inc(tot,n div i);
writeln(tot);
end.
结果为tot=14;
1的约数有1;
2的约数有1,2;
3的约数有1,3;
4的约数有1,2,4;
5的约数有1,5;
6的约数有1,2,3,6;
总共为14!(恰好为tot)
请思考为什么?
回到本题:
求t1,t2之间的所有数的约数个数和n;
我们可以考虑先求(t1-1)及以下的~~
再求t2 及以下的~~~
再相减;ok!!!
#include<stdlib.h>
long t1,t2,a,i;
int main(){
freopen("shlqsh.in","r",stdin);
freopen("shlqsh.out","w",stdout);
scanf("%ld%ld",&t1,&t2);
t1--;
for (i=1;i<=t1;i++) a-=t1/i;
for (i=1;i<=t2;i++) a+=t2/i;
printf("%ld",a);
return 0;
}