hdu 2601

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2601

题意:给n,找满足i*j+i+j == n的一对(i,j),其中0<i<=j<n。

mark:两边同时+1后得到(n+1)=(i+1)*(j+1)。只要从2到sqrt(n+1)枚举i+1的值就好了。不过时间有点久,2000+ms。正规的做法应该是用数论知识分解素因子。另外要考虑n是10^10,用long long(此处wa了一次)。

代码:

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


int main ()
{
    int T, sum, lim, i ;
    long long n ;
    scanf ("%d", &T) ;
    while (T--)
    {
        scanf ("%I64d", &n) ;
        sum = 0 ;
        lim = (int)sqrt (n+1) ;
        for (i = 2 ; i <= lim ; i++)
            if ((n+1) % i == 0) sum++ ;
        printf ("%d\n", sum) ;
    }
    return 0 ;
}
posted @ 2012-04-11 01:40  Seraph2012  阅读(169)  评论(0编辑  收藏  举报