HDU-2601 An easy problem

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

  题意:是将一个数 N 分解成 i * j + i + j 有多少种分解方式。

  思路:以 i 作为一个维度,j 作为第二维度进行循环,则 N = i * j + i + j = i * ( j + 1 ) + i ; 当 j = j + 1 时 N' = i * ( j + 1 )  + i + j + 1 = N + i + 1; 所以只要进行一为循环就可以了,判定 ( N - i ) % ( i + 1 ) == 0 ? 就可以了。

  代码:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
int T;
long long N;
scanf( "%d", &T );
while( T-- )
{
scanf( "%I64d", &N );
long long lim = ( long long )sqrt( double ( N + 1 ) ) - 1, cnt = 0;
for( long long i = 1; i <= lim; ++i )
{
if( ( N - i ) % ( i + 1 ) == 0 )
{
cnt++;
}
}
printf( "%I64d\n", cnt );
}
return 0;
}

 

posted @ 2011-12-02 20:19  沐阳  阅读(358)  评论(0编辑  收藏  举报