【Day3P1,又是数学问题】SHLQSH数 题解
第三天第一题。题目看起来很是纠结,没有简单的方法,稍微的优化就很难打,而且MS也过不了全点。其实这道题是一个小小的数学问题,想到即Easy。推荐看看《NOI导刊》10年第二期《妙解shlqsh数问题》一文,有这道题分析优化的全部过程。
【题目描述】
我们把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 div k(k<=n)表示小于等于n的数中有几个数的约数中含有k。这样公式的原理就很显然了。代码就几行,不过据说也有搜索写对的~强大Orz…
参考代码:
1 program shlqh;
2 var
3 x,y:longint;
4 i,tot:longint;
5 begin
6 readln(x,y);
7 for i:=1 to y do
8 tot:=tot+y div i;
9 for i:=1 to x-1 do
10 tot:=tot-(x-1) div i;
11 writeln(tot);
12 end.
(Saltless原创,转载请注明出处)