选数 - 题目 - Daimayuan Online Judge
问题描述:给定n个正整数a1,a2,…,an。 要求从其中选出若干数字, 使得这些数字的和mod n=0
(对于每个下标最多只能选择一次)。。
思路:
求前缀和并取模,可以得到前缀和的范围在[0, n-1]
,如果将前缀和sum[0]
也算是前缀和的话,前缀和就有n+1
个元素,可以发现对这n+1
个元素而言,一定存在两个是相同的值,那么结果就是这一段的下标。
鸽巢原理:如果有n+1个物体放进n个容器中,那么至少会有一个容器包含两个或更多的物体。
鸽巢原理,也被称为抽屉原理或鸽笼原理,是一种基本的数学原理,它来自于组合数学中的鸽巢箱原理。
这个原理的命名来源于一个直观的类比:想象你有n个鸽巢(容器),而需要放进去的鸽子(物体)的数量是n+1个。根据鸽巢原理,无论如何安排鸽子,必定会有至少一个鸽巢中多于一个鸽子。
代码:
void solve() {
int n; cin>>n;
vector<int> a(n + 1), sum(n + 1);
for(int i = 1; i <= n; ++i) cin>>a[i], sum[i] = (sum[i-1] + a[i]) % n;
map<int,int> mii;
mii[0] = 0;
for(int i = 1; i <= n; ++i) {
if(mii.count(sum[i])) {
cout<<i - mii[sum[i]]<<endl;
for(int j = mii[sum[i]] + 1; j <= i; ++j) cout<<j<<" ";
return ;
}
mii[sum[i]] = i;
}
}