时间限制: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; }