1. 程式人生 > >hihocoder-1543-SCI表示法

hihocoder-1543-SCI表示法

連續 integer return 根據 body 描述 == str des

hihocoder-1543-SCI表示法

#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

找到第一個數為 d, 長度為 len, 則 d + (d + 1) + .... + (d + len - 1 ) = sum;

有: (2 * d + len - 1)*len/2 = sum。 由於 d >= 1, 所以 len*len <= 2*sum 。

所以,可以根據 len 這個條件, 對sum 進行遍歷。 時間復雜度 O(sqrt(n))

#include <cstdio> 

int main(){ 
    int TC, n, ans; 
    
    while(scanf("%d", &TC) != EOF){
        for(int t = 0; t < TC; ++t ) {
            scanf("%d", &n); 
            /// 
            ans = 1; 
            for(int i=2; (long long)(i * i) <= 2*n; ++i){
                if(2*n%i != 0){ continue; } 

                if((2*n/i + 1 - i) % 2 == 0){
                    ans = i; 
                }
            } 
            /// 
            printf("%d\n", ans );
        }
    }
    
    return 0; 
}

hihocoder-1543-SCI表示法