列表

详情


NC214358. GCD

描述

牛牛有一个集合 S 包含 1 至 n 所有的数, 现在他想让你找一个最小的数 k , 使得在 S 中任意找一个子集 T , T 集合中的元素个数为 k , T 中都存在两个数 x , y ,且 gcd(x,y) > 1 . 如果找不到满足题目条件的 k ,就输出 -1 ,否则输出 k .

gcd(x, y) 为求 x y 的最大公约数。

输入描述

一个数字 n ( 1 ≤ n ≤ 1e5 )

输出描述

如果找不到满足题目条件的 k ,就输出 -1 ,否则输出 k .


示例1

输入:

3

输出:

-1

示例2

输入:

6

输出:

5

原站题解

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

pypy3(pypy3.6.1) 解法, 执行用时: 97ms, 内存消耗: 19672K, 提交时间: 2020-12-05 21:57:41

import math
n = int(input())
zhishu = 1
k = 1
for i in range(1,n+1):
    count = 0
    for j in range(2,int(i**0.5)+2):
        if i%j == 0:
            count = count+1
        if count>0:
            break;
    if count == 0:
        k = k+1
if k>=n:
    print(-1)
if k<n:
    print(k+1)

C(clang11) 解法, 执行用时: 2ms, 内存消耗: 748K, 提交时间: 2020-12-05 20:33:01

#include<stdio.h>
int a[100000]={0};
int main()
{
    
	int n,i,k,l;
	scanf("%d",&n);
	
	for(i=2;i<=n/2;i++){
		if(a[i]==1)
		continue;
		for(l=2,k=l*i;k<=n+1;l=l+1,k=i*l)
		a[k]=1;
	}
	for(l=0,i=1;i<n+1;i++)
	if(a[i]==0)
	l++;

if(l==n)
printf("-1");
else
printf("%d",l+1);
}

Python3(3.9) 解法, 执行用时: 332ms, 内存消耗: 2808K, 提交时间: 2021-03-29 14:15:34

n=int(input())
if n<4:
    print(-1)
else:
    ans = n
    for i in range(1, n + 1):
        t = int(i**0.5)
        for j in range(2, t + 1):
            if i % j == 0:
                ans = ans - 1
                break
    print(ans+1)

C++(clang++11) 解法, 执行用时: 30ms, 内存消耗: 484K, 提交时间: 2020-12-23 08:57:33

#include<stdio.h>
#include<math.h>
int main()
{int n,i,a[100],k=3,j;
scanf("%d",&n);
for(i=4;i<=n;i++)
{for(j=2;j<=sqrt(i);j++)
	if(i%j==0)break;
	if(j>sqrt(i))k++;
}
if(k+1>n)printf("-1");
else	printf("%d",k+1);
 return 0;
}

上一题