其他分享
首页 > 其他分享> > SP1798 ASSIST - Assistance Required 题解

SP1798 ASSIST - Assistance Required 题解

作者:互联网

Content

有一个足够长的数列 \(a\),是一个首项为 \(2\),公差为 \(1\) 的等差递增数列。另有一个初始为空的数列 \(b\)。

重复进行如下操作:

求出最后得到的序列 \(b\) 的第 \(n\) 项。

数据范围:\(1\leqslant n\leqslant 3000\)。

Solution

这题看上去很难,但事实上呢?是一道暴力题。

由于枚举到 \(35000\) 的时候数列 \(b\) 就已经超过了 \(3000\) 项,所以我们考虑从 \(2\) 到 \(35000\) 枚举,一个一个去标记,得到数列 \(b\),然后就可以直接 \(\mathcal O(1)\) 查询了。

由于能够加入数列 \(b\) 的数有限,因此可以保证这样枚举不会超过时限。

Code

namespace Solution {
	int cnt, vis[40007], ans[4007];
	
	iv getans() {
		F(int, i, 2, 35007) if(!vis[i]) {
			vis[i] = 1;
			int cnt2 = 0;
			F(int, j, i + 1, 35007) if(!vis[j]) {
				cnt2++;
				if(cnt2 == i) vis[j] = 2, cnt2 = 0;
			}
		}
		F(int, i, 2, 35007) if(vis[i] == 1) ans[++cnt] = i;
	}
	
	iv Main() {
		getans();
		while(1) {
			int n; read(n); 
			if(!n) break;
			println(ans[n]);
		}
		return;
	}
}

标签:数列,int,题解,Assistance,vis,cnt2,35007,ans,SP1798
来源: https://www.cnblogs.com/Eason-AC/p/15695206.html