用C++解决以下问题:给定序列 A=A_1A_2A_3A_N你可以选择一个整数 M将每个数都变成 mod M 后的值使序列中不同的数尽量少。例如 A=274选择M=4则序列A 变成 230有3 个不同的数。2=N=210^5
以下是使用C++解决该问题的代码:
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
unordered_set<int> uniqueValues;
for (int i = 0; i < N; i++) {
uniqueValues.insert(A[i] % N);
}
int M = uniqueValues.size();
cout << M << endl;
return 0;
}
该代码首先读取输入的序列长度N,并创建一个vector来保存序列A的元素。然后,通过循环读取N个元素,将它们存储在vector中。
接下来,我们使用unordered_set来保存序列A经过mod N运算后的不同的值。我们遍历序列A的每个元素,将它们对N取模后的值插入到unordered_set中。由于unordered_set只会保存不同的元素,因此最后unordered_set中的元素个数就是序列A中不同的数的个数。
最后,我们输出unordered_set的大小作为结果。
注意:该代码中假设输入的序列A中的元素都是非负整数。如果输入的序列A中可能包含负数,那么需要对代码进行适当的修改。
原文地址: https://www.cveoy.top/t/topic/i10k 著作权归作者所有。请勿转载和采集!