SHLQSH数

第一题 SHLQSH

                                                                       (shlqsh.pas/c/cpp)

【问题描述】

我们把t1 , t2 (包括t1 , t2 (1<=t1<t2<=10000000))之间的所有数的约数个数和n称为t1 , t2shlqsh;

问题是给出数据t1 , t2,t1 , t2shlqsh数;

【输入格式】

输入文件 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的约数有12

3的约数有13

4的约数有124

5的约数有15

6的约数有1236

总共为14(恰好为tot)

请思考为什么?


      
回到本题:

 t1,t2之间的所有数的约数个数和n

 我们可以考虑先求(t1-1)及以下的~~

             再求t2  及以下的~~~

 再相减;ok!!!

 

#include<stdio.h>
#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;
}

 

 

posted @ 2009-11-19 15:26  末日凌晨 散步的猫 ##  阅读(568)  评论(0编辑  收藏  举报