HDU4279-Number

来源:互联网 发布:金枪鱼代理软件 编辑:程序博客网 时间:2024/06/07 19:47

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4279
题意描述:如果数A是B的特殊数,那么A既不能被B整除,且A与B不能互素。我们定义f(x)为x之内x的特殊数的个数。那么给出两个数,求这两个数之间f(x)为奇数的数的个数,假设G(n)为1到n之间f(x)为奇数的数的个数。
题意分析:经过打表分析可知,当x≤5时,G(x)=0;当x>5时,G(x)从1开始,按照每两个数递增加1的规律递增,
但是在一个数如果是平方数的时候,如果是奇平方数,那就直接递增+1一次,如果是偶平方数,那这次就不递增加1,发现这个规律后,很容易就可以出来了、、、这个规律我们编程打印出来才分析了出来、、、


代码如下:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>


int main(){
    int T;
    __int64 m,n;
    __int64 sum1,sum2;
    scanf( "%d", &T );
    while( T -- ){
        scanf( "%I64d%I64d", &m, &n );
        sum1 = ( m-1 - 4 ) / 2;
        sum2 = ( n - 4 ) / 2;
        if( (__int64)sqrt( m-1 ) % 2 == 1 )
            sum1 ++;
        if( (__int64)sqrt( n ) % 2 == 1 )
            sum2 ++;
        if( m-1 < 6 )
            sum1 = 0;
        if( n < 6 )
            sum2 = 0;
        printf( "%I64d\n", sum2-sum1 );
    }
    return 0;
}


注:后来才知道,当n>2的时候,n的欧拉函数永远是一个偶数。而且当n为平方数,其约数个数为奇数;
n为非平方数,其约数个数为偶数。而 f(x) = x - 约数个数 - 互质数个数 +1 。根据这个可以很快就推出来了。