数字总和为sum,分成的两组的sum和分别是sum_1和sum_2,sum1+sum2=sum ,所求就是最大的gcd(sum1,sum2) ,我们设为ans。
gcd性质:gcd(sum1,sum2)=gcd(sum1,sum)=gcd(sum2,sum)
gcd(x,y)=gcd(x,x+y)
易得 :
sum1/ans+sum2/ans = sum/ans
那么ans是sum的一个因数,所求转化为sum最大因数。
(除了它本身)
暴力枚举找到sum最小的因子x ,sum/x=ans。
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <iomanip>
#include <cmath>
#include <map>
#include <stack>
#include <algorithm>
#include <queue>
#include <set>
#include <cstdio>
#define INF 0x3f3f3f3f
#define MAX 200100
#define ll long long
#define N 10010
using namespace std;
//一看IO流就是我做的!
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
if(n==2) cout<<1<<endl;
//特判。
else
{
int ans=1;
int sumadd=n*(n+1)/2;
for(int i=2; i<sumadd; i++)
//从2开始循环,毕竟最小因数永远有1.
{
if(sumadd%i==0)
{
ans=sumadd/i;
break;
}
}
cout<<ans<<endl;
}
}