地址: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 ; }