B.Gcd(hdu6545)

 

 重点重点是和的最大公约数最大,两部分的分别的最大公约数一定也是两部分和的最大公约数,所以直接求和就好了,用等差数列前n项和公式,sum=n*(n-1)/2;

然后倒着找最大公约数,(就从前往后枚举最小的因数,然后用和除较小的因子即可得到最大的因子)

从前向后硬找因子会t,所以就用了上面那个办法

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    while(~scanf("%lld",&n))
    {
         ll sum=n*(n+1)/2;//前n项和公式  (首项+尾项)*项数/2
         for(ll i=2;i<sum/i;i++)
         {
             if(sum%i==0)
             {
                  printf("%lld\n",(sum/i));
                  break;
             }
         }

    }
    return 0;
}

 

posted @ 2021-03-29 18:49  BlackSnow  阅读(92)  评论(0)    收藏  举报