POJ 2853 Sequence Sum Possibilities
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5537 | Accepted: 3641 |
Description
Most positive integers may be written as a sum of a sequence of at least two consecutive positive integers. For instance,
6 = 1 + 2 + 3but 8 cannot be so written.
9 = 5 + 4 = 2 + 3 + 4
Write a program which will compute how many different ways an input number may be written as a sum of a sequence of at least two consecutive positive integers.
Input
The first line of input will contain the number of problem instances N on a line by itself, (1 ≤ N ≤ 1000) . This will be followed by N lines, one for each problem instance. Each problem line will have the problem number, a single space and the number to be written as a sequence of consecutive positive integers. The second number will be less than 231 (so will fit in a 32-bit integer).
Output
The output for each problem instance will be a single line containing the problem number, a single space and the number of ways the input number can be written as a sequence of consecutive positive integers.
Sample Input
7 1 6 2 9 3 8 4 1800 5 987654321 6 987654323 7 987654325
Sample Output
1 1 2 2 3 0 4 8 5 17 6 1
7 23
题目大意:输入一个整数n,问总共有多少个连续序列之和为这个数。
解题方法:如果直接从0开始遍历依次肯定超时,在这里这个序列肯定为一个公差为1的等差数列,假设首项为a1,长度为i,如果满足条件,则n = a1 * i + i * (i - 1) / 2;
即n -i * (i - 1) / 2 = a1 * i;也就是说n的值为长度为i,首项为a1的等差数列之和,所以只要判断(n -i * (i - 1) / 2) % i是否为0即可,当然长度i有一个范围,假设a1为最小值1,那么长度i肯定为最大值,n = i + i * (i - 1) / 2,即n = i * (i + 1) / 2,所以i的最大值不会超过sqrt(n * 2.0)。
#include <stdio.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; int main() { int nCase, index, n; scanf("%d", &nCase); while (nCase--) { int ans = 0; scanf("%d%d", &index, &n); for (int i = 2; i <= sqrt((double)n * 2.0); i++) { if ((n - i * (i - 1) / 2) % i == 0) { ans++; } } printf("%d %d\n", index, ans); } return 0; }