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; }