题目链接
https://vjudge.net/problem/CodeForces-1038B
题意
有1—n个数,问能否把他们分成两个非空集合S1,S2,使得 gcd(sum(S1),sum(S2)) > 1
思路
-
如果n=1或n=2,显然不行
-
如果n>2,通过观察可以发现,奇数分成一组,偶数分成一组,他们必有公因数2。
题解的解法更简单,因为n个数的和是 n*(n+1)/2,所以一个集合放n/2,一个集合放其他的,那么他们必有公因数k。
AC代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<sstream>
#include<cctype>
#include<map>
#include<stack>
#include<queue>
#include<list>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const double PI = atan(1.0)*4;
const int INF = 0x3f3f3f3f;
const ll MOD = 1000000007;
const int maxn = 100010;
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int n;
scanf("%d", &n);
if(n == 1 || n == 2)
printf("No\n");
else
{
printf("Yes\n");
if(n % 2 == 0)
{
printf("%d", n / 2);
for(int i = 2; i <= n; i = i + 2)
printf(" %d", i);
printf("\n%d", n / 2);
for(int i = 1; i <= n; i = i + 2)
printf(" %d", i);
printf("\n");
}
else
{
printf("%d", n / 2);
for(int i = 2; i <= n; i = i + 2)
printf(" %d", i);
printf("\n%d", n / 2 + 1);
for(int i = 1; i <= n; i = i + 2)
printf(" %d", i);
printf("\n");
}
}
return 0;
}