HihoCoder

来源:互联网 发布:能耗分析软件 编辑:程序博客网 时间:2024/06/03 15:10

#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
样例输出
51
设最左边的数是l,最右边的数是r,l到r连续,有公式n=(l+r)*(r-l+1)/2。所以2n=(l+r)(r-l+1);

可知(l+r)和(r-l+1)是2n的因数,又因为(l+r)-(r-l+1)==2l+1,是奇数。

所以枚举2n的因数,且两个因数差为奇数,较小的数为答案。取答案的最大值

#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;int main(){    long long n,m,ans;    while(scanf("%lld",&m)!=EOF)    {        while(m--)        {            scanf("%lld",&n);            long long flag=sqrt(2*n);            ans=1;            for(long long i=1;i<=flag;i++)            {                if(2*n%i==0)                {                    long long t=2*n/i;                    if((t-i)%2!=0)                        ans=max(ans,i);                }            }            printf("%lld\n",ans);        }    }}

原创粉丝点击