Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5537 | Accepted: 3641 |
Descriptionios
Most positive integers may be written as a sum of a sequence of at least two consecutive positive integers. For instance,less
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.spa
Inputcode
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).blog
Outputip
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.input
Sample Inputstring
7 1 6 2 9 3 8 4 1800 5 987654321 6 987654323 7 987654325
Sample Outputit
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; }