列表

详情


NC231600. 智乃与三元环

描述

心爱想让智乃喊自己姐姐,但是智乃是一个害羞的女孩子,觉得这样太羞耻了,于是智乃抛出一道题目,如果心爱想出来了,就答应心爱的要求。 聪明的心爱当然是一下子就想出来了,那么你会写这道题吗?

智乃给出一个包含 n 个点的图,点的编号分别为1,2,3......,n, 两点编号如果互质(即最大公约数为1)则连一条边,现在你要用数量最少的三元环去覆盖所有的点,每条边只能用一次,但一个点可以覆盖多次。 请输出最少的三元环个数以及覆盖方案(答案可能有很多,输出任意一种),如果不存在合法方案则输出-1。

输入描述

第一行包含一个正整数 n (3≤n≤1e5),表示点的个数。

输出描述

第一行输出一个整数 k ,表示三元环个数,如果不存在方案则输出-1。接下来有 k 行,每行三个数表示一个三元环。

示例1

输入:

3

输出:

1
1 2 3

示例2

输入:

4

输出:

-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 21ms, 内存消耗: 1096K, 提交时间: 2022-12-16 14:56:13

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
    int n;
    cin>>n;
    if(n==4)
    {
        puts("-1");return 0;
    }
    if(n&1)
    {
        cout<<n/2<<'\n';
        for(int i=2;i<=n;i+=2)
            cout<<1<<" "<<i<<" "<<i+1<<'\n';
    }
    else 
    {
        cout<<n/2<<'\n';
        cout<<2<<" "<<3<<" "<<5<<'\n';
        for(int i=3;i<=n;i+=2)
            cout<<1<<" "<<i<<" "<<i+1<<'\n';
    }
    return 0;
}

pypy3 解法, 执行用时: 171ms, 内存消耗: 29236K, 提交时间: 2021-12-07 17:58:44

n = int(input())
if n == 4:
    print(-1)
    exit()
if n % 2:
    print(n//2)
    for i in range(2, n, 2):
        print(1, i, i+1)
else:
    print(n//2)
    for i in range(3, n, 2):
        print(1, i, i+1)
    print(2, 3, 5)

C++ 解法, 执行用时: 13ms, 内存消耗: 1160K, 提交时间: 2021-12-08 09:33:58

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if (n==4)
	{
		puts("-1");
		return 0;
	}
	printf("%d\n",n/2);
	for (int i=2;i<=n;i+=2)
	{
		printf("%d %d %d\n",i-1,i,(i+1>n)?1:i+1);
	}
	return 0;
}

上一题