题解 CF1091C

题解CF1091C

这个题乍一看,好像有点像约瑟夫问题,但是写完了之后会发现,就会发现 TLE

因为 \(n\le10^9\) ,而且用约瑟夫问题写的话每次都会跳 k 步,肯定会超时

超时代码

这里就占用版面不细讲暴力算法了,有兴趣的自己点超时代码查看

正解:

我们发现这个其实就是求一下 n 的约数都有哪些

因为,只要这个步数是可以被 n 整除的,我们就可以计入答案

又因为,这里的步数是相同的,所以我们可以直接利用等差数列求和公式求出这里所有走到的点的下标的和

#include<cstdio>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
int n,tot;
vector<int> v;
int calc(int x){
	return (1+n-x+1)*(n/x)/2;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i*i<=n;i++){
		if(n%i){
			continue ;
		}
		v.push_back(calc(i));
		if(i*i==n){
			continue ;
		}
		v.push_back(calc(n/i));
	}
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());
	for(int i=0;i<v.size();i++){
		printf("%lld ",v[i]);
	}
	puts("");
	return 0;
}
posted @ 2022-11-30 09:15  Tyrue  阅读(9)  评论(0编辑  收藏  举报