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;
}