ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(数论选拔)联盟阵容

2021-03-05 23:34:41  阅读:256  来源: 互联网

标签:联盟 阵容 战斗力 nn 数论 选拔 int maxn gcd


瓦罗兰大陆有n个英雄,他们编号从1到n,每个英雄的战斗力等于他的编号。

某一天这些英雄们准备建立k个联盟,编号为1到k,每个英雄只能加入一个联盟。

每个联盟的战斗力等于它里面的所有英雄的战斗力之和。

但是英雄们都很傲娇,他们想让自己的联盟的战斗力是一个质数,而且他们想让kk尽可能小。

如果他们能按照自己的心意建立联盟,就输出k和这k个联盟的战斗力。

如果有多种情况可以满足他们的心意,就输出让联盟的最小战斗力最小的哪一种。

   例子:

        假设两种情况[2,4,7]  ,  [3,4,6] 都满足条件,由于方案一 种最小的联盟的战斗力是2,小于方案二种的3, 

        所以应该输出 2 , 4,7

否则输出-1.

Input

一个数nn 

nn  <=3000

 

Output

如果n==0或者无解,输出-1.

否则 

 一个整数代表联盟的数量kk

  然后nn个整数代表从小到大依次输出他们的战斗力

Samples

Input 复制
5
Output
2
2 13

Source

2021年昆明区域赛选拔【数论】

 

这个题就是1到n每一个数都可以加入一个阵营,最后k个阵营,每个阵营的和都是素数,问最少要几个阵营

 

这个题就是一共就有三种情况

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=6e6+100;
int biaoji[maxn];
int cnt=0;
int prime[maxn];
void inint(){
    for(int i=2;i<=maxn;i++){
        if(!biaoji[i]){
            prime[++cnt]=i;    
        }
        for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
            biaoji[i*prime[j]]=1;
            if(i%prime[j]==0){
                break;
            }
        } 
    }
}
int main(){
    inint();
    int n;
    cin>>n;
    if(n==0||n==1){
        cout<<-1<<endl;
    }
    else{
        int sum=0;
        for(int i=1;i<=n;i++){
            sum+=i;
        }
        if(!biaoji[sum]){
            cout<<1<<endl<<sum<<endl;
            return 0;
        }
        for(int i=2;i<=n;i++){
            int p=sum-i;
            if(!biaoji[i]&&!biaoji[p]){
                cout<<2<<endl;
                cout<<i<<" "<<p<<endl; 
                return 0;
            }
        }
        int flag=0;
        for(int i=2;i<=n;i++){
            if(!biaoji[i]){
                for(int j=2;j<=n;j++){
                    int p1=i,p2=j,p3=sum-i-j;
                    if(!biaoji[p1]&&!biaoji[p2]&&!biaoji[p3]){
                        cout<<3<<endl;
                        cout<<i<<" "<<j<<" "<<p3<<endl;
                        flag=1; 
                        break;
                    }
                }
            }
            if(flag){
                break;
            }    
        } 
    }
} 
/*
2342
*/

作为老学长,我决定给每一个学弟学妹发一朵小红花以鼓励他们加紧训练。然而发一朵太掉价了,所以我决定发一堆,当前我共有nn堆花朵,第ii堆有a[i]a[i]朵花,0≤a[i]≤1e90≤a[i]≤1e9。然而本人具有强迫症,我想给每一堆花都增加xx朵,使得这nn堆花的gcd最大。

因为19的人数不多,所以n≤20n≤20,请帮我求出最大的gcd并求出满足最大gcd时最小的xx是多少。

Input

第一行一个nn,随后nn个数字代表nn堆花的数量

Output

请输出最大的gcd是多少,并求出满足最大gcd时最小的xx是多少。

Samples

Input 复制
2
7 10
Output
3 2

Source

2021年昆明区域赛选拔【数论】

 

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+100;
int a[maxn];
int b[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    } 
    sort(a+1,a+n+1);
    if(a[1]==a[n]){
        cout<<a[1]<<0<<endl;
    }
    else{
        int x=0,p=0;
        for(int i=1;i<=n;i++){
            x=__gcd(x,a[i]);
        }
        for(int i=1;i<=1e4;i++){
            int z=0;
            for(int j=1;j<=n;j++){
                b[j]=a[j]+i;
                z=__gcd(z,b[j]);
            }
            if(z>x){
                x=z;
                p=i;
            }
        }
        cout<<x<<" "<<p<<endl;
    }
}

 

标签:联盟,阵容,战斗力,nn,数论,选拔,int,maxn,gcd
来源: https://www.cnblogs.com/lipu123/p/14489045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有