1. 程式人生 > >#1543 : SCI表示法

#1543 : SCI表示法

nbsp color namespace () clas code 單點 space 數列

時間限制: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; }

#1543 : SCI表示法