题意:是将一个数 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#include #include #include #include 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; }