zoukankan      html  css  js  c++  java
  • POJ 2853 Sequence Sum Possibilities

    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 + 3
    9 = 5 + 4 = 2 + 3 + 4
    but 8 cannot be so written.

    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
    ", index, ans);
        }
        return 0;
    }
     
  • 相关阅读:
    java高级程序设计(第十周)
    java高级程序设计(第五周)
    java高级程序设计(第四周)
    期末设计(第十四周)
    期末设计(第十三周)
    期末设计(计划进度表)
    Java学习笔记(六)
    Java学习笔记(六)
    Java学习笔记(五)
    Java学习笔记(四)
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3265301.html
Copyright © 2011-2022 走看看