A problem is easy
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
- 描述
-
When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of water plus 1 pile of dough ..” , “100 yuan buy 100 pig” .etc..
One day Teddy met a old man in his dream , in that dream the man whose name was“RuLai” gave Teddy a problem :
Given an N , can you calculate how many ways to write N as i * j + i + j (0 < i <= j) ?
Teddy found the answer when N was less than 10…but if N get bigger , he found it was too difficult for him to solve.
Well , you clever ACMers ,could you help little Teddy to solve this problem and let him have a good dream ?- 输入
- The first line contain a T(T <= 2000) . followed by T lines ,each line contain an integer N (0<=N <= 10^11).
- 输出
- For each case, output the number of ways in one line
- 样例输入
-
2 1 3
- 样例输出
-
0 1
分析:
i*j+i+j=n<=> (i+1)*(j+1)=n+1;
因此只要从2到sqrt(n+1)找就可以了。
如果(n+1) % i == 0,那么就说明找到一个。
查看代码---运行号:252167----结果:Accepted
运行时间:
2012-10-05 11:22:30 | 运行人:
huangyibiao
01.
#include <iostream>
02.
#include <cmath>
03.
using
namespace
std;
04.
05.
int
main()
06.
{
07.
int
testNum;
08.
cin >> testNum;
09.
10.
while
(testNum--)
11.
{
12.
int
count = 0;
13.
long
n;
14.
cin >> n;
15.
16.
long
s = (
long
)(
sqrt
(n+1));
17.
for
(
long
i = 2; i <= s; i++)
18.
{
19.
if
((n+1) % i == 0)
20.
{
21.
count ++;
22.
}
23.
24.
}
25.
cout << count << endl;
26.
}
27.
28.
29.
return
0;
30.
}