首页 > 其他分享 >2023牛客寒假基础训练营3 I(哥德巴赫猜想)

2023牛客寒假基础训练营3 I(哥德巴赫猜想)

时间:2023-01-23 14:00:29浏览次数:64  
标签:约数 int 质数 偶数 牛客 哥德巴赫猜想 2023 primes

I.灵魂碎片的收集

题目大意:

定义S(n) 表示为所有小于n的约数之和。例如S(10) = 1 + 2 + 5 = 8
现在给定一个数x,求是否有一个n满足S(n) = x。
(题目保证如果x为偶数,那么x-1或者x-3其中至少有一个为质数,若x为奇数,则没有限制)


解题思路:

哥德巴赫猜想:

  1. 任何一个大于6的偶数都可以表示成两个素数之和
  2. 任何一个大于9的奇数都可以表示成三个素数之和

当我们看到题目中的数据保证时第一时间就会考虑到以x为奇数\偶数来分类。

  1. 如果x为偶数:
  • 我们考虑x-1或者x-3为质数会对答案有什么贡献,如果为质数,那么他所能提供的约数只有1和质数本身
  • 所以如果当x-1为质数时,如果这时候的约数为1和x-1,那他的和刚好就是x,所以此时我们构造n为(x-1)^2,那么小于n的约数就为[1、x-1]
  • 同样如果x-3为质数时,他所能提供的约数为1和x-3,与x相比还差2,所以我们考虑给它补一个约数2,所以我们构造n为2*(x-3),此时小于n的约数为[1、2、x-3]
  1. 如果x为奇数:
  • 我们会发现如果去构造奇数是很难的,所以我们考虑将问题转化为偶数的情况下,此时我们考虑x-1的情况,因为x-1为偶数,那么根据哥德巴赫猜想,在大于6的情况下可以将其表示为两个素数之和,也就是说n的约数可以由[a,b]两个质数构成,那么他们的和就是a+b = x-1,再加上1这个约数,刚好满足约数之和为x,所以我们就考虑构造n = a X b(a,b为两个大于x的不同质数)
  1. 特殊情况:
  • 因为我们用到了哥德巴赫猜想,所以对于x-1小于等于6的情况都需要进行特判,自己写写就出来了

代码实现:

# include<bits/stdc++.h>
using namespace std;
const int N = 5e6+10;
# define int long long
vector<int> e[N];
int a[N];
int f[N],sz[N];
int primes[N];//质数 
int vis[N],minp[N],cnt;//minp 对x的最小质数 
void init()
{
    for(int i = 2; i < N; i ++ )
    {
        if(!vis[i]) primes[cnt ++ ] = i, minp[i] = i;
        for(int j = 0; primes[j] * i < N; j ++ )
        {
            vis[primes[j] * i] = true;
            minp[primes[j] * i] = primes[j];
            if(i % primes[j] == 0) break;
        }
    }
}

signed main(){
    init();
    int tt;
    cin>>tt;
    while(tt--){
        int n;
        cin>>n;
        if(n == 1) {
            cout<<3<<endl;
            continue;
        }
        if(n == 3) {
            cout<<4<<endl;
            continue;
        }
        if(n == 5||n==2){
            cout<<-1<<endl;
            continue;
        }
        if(n==6){
            cout<<6<<endl;
            continue;
        }
        if(n==7){
            cout<<8<<endl;
            continue;
        }
        if(!(n&1)){
            if(!vis[n-1]) cout<<(n-1)*1ll*(n-1)<<endl;
            else if(!vis[n-3]) cout<<2ll*(n-3)<<endl;
            else cout<<-1<<endl;
        }
        else{
            bool ok = false;
            for(int i = 0;i < cnt;++i){
                if(primes[i]<n-1&&(!vis[n-1-primes[i]])&&(n-1-primes[i]!=primes[i])){
                    int ans = primes[i]*(n-1-primes[i]);
                    cout<<ans<<endl;
                    ok = 1;
                    break;
                }
            }
            if(!ok) cout<<-1<<endl;
        }
    }
    
    
    return 0;
}

标签:约数,int,质数,偶数,牛客,哥德巴赫猜想,2023,primes
From: https://www.cnblogs.com/empty-y/p/17065145.html

相关文章

  • template 2023-01-23
    template2023-01-23(......
  • 算法--2023.1.22
    1.力扣287--寻找重复数classSolution{//环形链表2的变形:数组游标是指针,数组中的元素值是该节点指向下一个节点的指针//该问题可以转化为找到环的入口pu......
  • 算法--2023.1.23
    1.力扣300--最长递增子序列classSolution{publicintlengthOfLIS(int[]nums){//贪心算法,基本思路:dp数组维护长度为下表i的最长子序列的最后一个值的......
  • CTS 2023 游记【脱敏版】
    该版本删去了一些可能敏感的信息.2023.12.16前几天和戴老师聊天的时候想能不能给CTS投点题什么的,如果又全是Ynoi题就不好了呢.毕竟前段时间lxl[数据删除],这是......
  • 2023年哪款手机浏览器比较好用,最后一个吹爆它
    很多人不满足于手机自带的浏览器,为了更好地满足看视频、浏览网页、看小说等需求,不少人下载第三方手机浏览器来使用。我们都知道,手机浏览器是手机不可缺少的APP之一。那么,202......
  • 中国各省新冠疫苗接种数据(2022-2023)
    中国各省新冠疫苗接种数据(2022-2023)中国各省新冠疫苗接种数据(2022-2023)中国各省新冠疫苗接种数据(2022-2023) 最新版数据已整理为Excel格式,数据的时间区间为2022-2023年,内含......
  • 2023年1月23日笔记
    连接池C#客户端暴露的所有接口均为异步接口。使用C#客户端从首先建立一个SessionPool开始,建立SessionPool时需要指定服务器的IP、Port以及SessionPool的大小,SessionPoo......
  • 基本密码类型及特征----2023.1.22
    1,md5特征:阿拉伯数字和大小写英文26个字母2,当铺密码特征:将中文和数字进行转化的密码 ,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。转化密文:王夫井工夫......
  • 2023-01-22 返工
    2023-01-22周日大年初一,后半夜四点多就出门坐车回东莞了,路途休息的服务站风景挺不错的。直到中午十二点多才到东莞滨湖万科里,到了就直接开工啦。没想到出门的时候下......
  • 【游记】NOI WC 2023线上
    摸鱼记录Day1:那一天记得只有开幕式,开幕式确实十分无聊,几个人在那里上台讲话,又有几个人在那里上台表演,看完开幕式,我认为就是浪费了一个小时。不过今年是NOI40周年,看着那......