数论
题目
给定整数n,胖教授想将1~n这n个数字分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。
输入格式
一行一个整数n。
输出格式
输出一行一个整数表示答案。
样例输入
6
样例输出
7
数据规模
对于20%的数据,保证n≤100。
对于100%的数据,保证n≤1e9。
题解:
#include <iostream>
using namespace std;
typedef long long LL;
int divide(int x){//找x的最小因子
for(int i=2;i<=x/i;i++)
if(!(x%i))return i;
return x;
}
int main(){
int n;
cin>>n;
int d;
if(n&1) d=min(divide(n),divide((n+1)/2));//因为数据范围太大,所以分割成两部分来找最小因子
else d=min(divide(n/2), divide(n+1));
LL res;
if(n<=2)res=1;//但要注意特判,2分割之后所得最小因子已经大于2了,故不能再用上述方法
else res=(LL)n*(n+1)/2/d;
cout<<res<<endl;
return 0;
}