#456. 选数

选数 - 题目 - 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;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_63432403/article/details/132680367
456