列表

详情


NC236626. 减法和求余

描述

鸡尾酒的学生丹丹分不清求余和减法,因为他觉得两种运算都是将一个数字变小,所以都差不多。

为了让丹丹能够更好地理解求余和减法,鸡尾酒给了他这样一个问题:

给定 n 个数字,每次有两种操作:

1. 从所有正整数中任选一个数字 ,并将所有数字全部对 x 求余。
2. 从这 n 个数字中任选一些数字,使得它们全部减去一。

问最少进行多少次操作可以让所有数字全部变为 0。

这两种操作都需要“任选”,而丹丹有选择困难症,所以无法解决这一问题,你可以帮帮他吗?

输入描述

第一行给出一个正整数 ,表示数字的数量。

接下来给出 n 个数字,其中第 i 个数字记作

输出描述

输出一行一个整数表示答案。

示例1

输入:

5
1 3 0 12 10

输出:

2

说明:

选择x=3,先将所有数字对 3 求余,此时数组变为 [1,0,0,0,1],再选择第一个数字和第五个数字减一,共两次操作可以使得所有数字全部变为 0。

示例2

输入:

6
5 20 100 15 5 0

输出:

1

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 49ms, 内存消耗: 448K, 提交时间: 2023-07-11 14:35:02

#include<iostream>
#include<algorithm>
using namespace std;
int n,a;
int main()
{
    cin>>n;
    int st0=0,st1=0,gcd=0;
    for(int i=0;i<n;i++){
        cin>>a;
        gcd=__gcd(a,gcd);
        if(a==0) st0++;
        if(a==1) st1++;
    }
    if(gcd==0) cout<<0;
    else if(st1+st0==n||gcd>1) cout<<1;
    else cout<<2;
}

C++ 解法, 执行用时: 22ms, 内存消耗: 424K, 提交时间: 2022-05-23 21:32:22

#include <bits/stdc++.h>
using namespace std;
int main()
{	
	int n,a,gcd=0,pd0=0,pd1=1;
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		gcd=__gcd(gcd, a);
		if(a>1)pd1=0;
		if(a==0)pd0++;
	}
	if(pd0==n)cout<<0;
	else if(pd1 || gcd>=2)cout<<1;
	else cout<<2; 
}

pypy3 解法, 执行用时: 168ms, 内存消耗: 32552K, 提交时间: 2023-07-11 00:58:41

from math import gcd

int(input())
a = list(map(int, input().split()))
x = a[0]
for num in a:
    x = gcd(x, num)
if max(a) == 0:
    print(0)
elif x != 1 or max(a) == 1:
    print(1)
else:
    print(2)

上一题