第二届太原理工大学程序设计新生赛决赛 J Fuse the Cube Fragment

题目传送门

在解密完那条古怪的序列后的不久,Vanis收到了一个奇怪的包裹,寄件人地址竟然写着火星 ()。包裹里有一堆蕴含着能量的小晶块 (Cube Fragment),经过一些实验,Vanis发现这些小晶块具有如下性质:

  1. 有n种不同的小晶块,编号1至n,每种晶块都蕴含1个单位的能量。
  2. 两种晶块(第i种和第j种)能够稳定融合,当且仅当i \nmid ji∤j且j \nmid ij∤i,其中\nmid∤表示不能整除。

Vanis想知道如果每种小晶块只使用一个,能够融合成的稳定的大晶体最大能蕴含多少个单位的能量,他想请你给出两种不同的融合方案。

两种融合方案是不同的,当且仅当至少存在一种晶块出现在一种方案中而不出现在另一种方案中。

输入描述:
输入一行一个整数n,表示小晶块的种类数。

数据规范:
5≤n≤3×10^4
.
输出描述:
输出两行,表示两种不同的融合方案,每行输出一种,使用编号表示使用哪种小晶块,每行输出内的编号之间使用一个空格符分隔。

注意:

  1. 融合顺序无关,即"3 2 5"与"3 5 2"被认为是同一种融合方案。
  2. 满足条件的融合方案可能不止有两种,任意合理的两种融合方案都会被认为是正确的。
    示例1
    输入

5

输出

3 2 5
3 4 5

示例2
输入

7

输出

2 3 5 7
4 6 5 7

思路:开始还以为是2-n之间的所有素数,后来多推几个数据发现了是后一半的数这个结论。
代码比较简单。

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int sum,n;
bool isPrime( ll num )
{
    
    if(num ==2|| num==3 )   
        return 1 ;
    if(num %6!= 1&&num %6!= 5)  
        return 0 ;
    int tmp =sqrt(num);
    for(int i= 5; i <=tmp; i+=6 )   
        if(num %i== 0||num %(i+ 2)==0) 
            return 0 ;
    return 1 ;
}
int main()
{
    int n;
    cin>>n;
    if(n==5)
    {
        cout<<2<<" "<<3<<" "<<5<<endl;
        cout<<3<<" "<<4<<" "<<5<<endl;
        return 0;
    }
    for(int i=n/2+1;i<=n;i++)
        cout<<i<<" ";
    cout<<endl;
    int tem=n/2;
    for(int i=n/2;i<=n;i++)
    {
        if(i%tem==0&&i!=n/2)continue;
        cout<<i<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章