hiho292 題目1 : 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

思路:

簡單枚舉,假設連續正整數的首項是a,項數是m,那麼根據等差數列求和公式有:
n=(a+a+m1)m2 n = \frac{(a+a+m-1)*m}{2}
於是有:
2n=(2a+m1)m 2*n = (2*a+m-1)*m
所以 m 是 2n的約數。我們可以枚舉2n所有的約數,並檢查a是否有整數解。然後記錄m的最大值就是答案。由於約數是成對出現的,所以只要枚舉[1,2n][1,\sqrt{2*n}]就行。

#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;

void solve(int& n) {

	int sum = 2*n;
	int res = 0;
	int nums = sqrt(sum);
	for (int i = 1; i <= nums; ++i) {
		if (sum%i == 0) {
			int tmp = (sum/i + 1 - i) / 2;
			if((tmp*2+i-1)*i == sum)
				res = max(res,i);
		}
	}
	cout << res << endl;
}

int main()
{
	/* code */
	int t, n;
	cin >> t;
	while(t--) {
		cin >> n;
		solve(n);
	}

	return 0;
}
發佈了179 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章