B.不可思议
题目链接:https://ac.nowcoder.com/acm/contest/6220/B

分析:可以发现对于u = i + 1, v = (s4 % i) + 1,也就是每次u都会连一个编号小于它的节点,那么我们可以直接开一个数组fa[],暴力往上爬,爬到根节点。

using LL = long long;
const int N = 100005;
const int mod = 998244353;
int fa[N];

LL update(int x, int y)
{
	LL res = 0;
	while (x)
	{
		res = res + ((y + 2 * x) ^ (y + x)) % mod;
		x = fa[x];
	}
	return res % mod;
}

class Solution {
public:
	/**
	 *
	 * @param n int整型
	 * @param seed1 long长整型
	 * @param seed2 long长整型
	 * @param seed3 long长整型
	 * @param x int整型
	 * @return long长整型
	 */
	long long work(int n, long long s1, long long s2, long long s3, int x) {
		long long s4;
		int u, v;
		for (int i = 1; i < n; ++i)
		{
			s4 = (s1 + s2) % mod * s3 % mod;
			u = i + 1, v = (s4 % i) + 1;
			fa[u] = v;
			s3 = s2;
			s2 = s1;
			s1 = s4;
		}

		LL lastans = 0;
		LL ret = 0;
		LL y = 0;
		int z = 0;
		for (int i = 1; i <= n; ++i)
		{
			z = update(x, y);
			ret = (ret + z) % mod;
			lastans = z;
			x = ((x + lastans) ^ ret) % n + 1;
			y = lastans;
		}
		return ret;
	}
};

C.牛牛晾衣服
题目链接:https://ac.nowcoder.com/acm/contest/6220/C

分析:POJ原题-POJ3104,我们二分时间,对于时间t,如果一件衣服可以在自然时间内烘干,那么我们就不放进洗衣机里面。否则假设这件衣服用了t时间,那么a[i] - t * k <= mid - t,我们可以得到时间t,不等式的解为\(t >= \frac{a[i] - mid}{k - 1}\),那么这些烘干衣服的时间只要小于总时间即可。

bool check(int x, vector<int>& a, int k)
{
	int sum = 0;
	for (int i = 0; i < a.size(); ++i)
	{
		if (a[i] > x)
			sum += ceil((a[i] - x) * 1.0 / (k - 1));
	}
	if (sum > x) return false;
	return true;
}

class Solution {
public:
	/**
	 * 计算最少要多少时间可以把所有的衣服全烘干
	 * @param n int整型 n件衣服
	 * @param a int整型vector n件衣服所含水量数组
	 * @param k int整型 烘干机1分钟可以烘干的水量
	 * @return int整型
	 */
	int solve(int n, vector<int>& a, int k) {
		int mx = 0;
		for (int i = 0; i < a.size(); ++i)
		{
			mx = max(mx, a[i]);
		}
		int l = 1, r = mx;
		while (l < r)
		{
			int mid = l + r >> 1;
			if (check(mid, a, k)) r = mid;
			else l = mid + 1;
		}
		return r;
	}
};