#1543 : SCI表示法

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示成4+5+6,8可以表示成8本身。我们称这种表示方法为SCI(Sum of Consecutive Integers)表示法。  

小Hi发现一个整数可能有很多种SCI表示,例如15可以表示成1+2+3+4+5,4+5+6,7+8以及15本身。小Hi想知道N的所有SCI表示中,最多能包含多少个连续正整数。例如1+2+3+4+5是15包含正整数最多的表示。

输入

第一行一个整数 T,代表测试数据的组数。  

以下 T 行每行一个正整数N。  

对于30%的数据,1 ≤ N ≤ 1000  

对于80%的数据,1 ≤ N ≤ 100000  

对于100%的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 1000000000

输出

对于每组数据输出N的SCI表示最多能包含多少个整数。

样例输入
2  
15  
8
样例输出
5
1

等差数列求和,设起点n1 终点n2 经过推导可以求得(n1 + n2)*(n2 - n1 + 1) = 2*n

n为输入的值。那么我们可以sqrt枚举2*n的约数。大的约数为n1+n2 小的为n2-n1+1

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    int t;
    cin >>t;
    while (t--){
        cin>>n;
        int m = 2*n;
        int ans = 1;
        int n1, n2;
        for (int i = 2; i*i <= m; ++i) {
            if (m % i == 0){
                int x = m / i;
                int y = x + 1 - i;
                if (y % 2 == 0) {
                    n1 = y / 2;
                    n2 = i + n1 - 1;
                    ans = max(ans, n2 - n1 + 1);
                }
            }
        }
        cout <<ans <<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pk28/p/7259738.html