今天模拟考rk2!快乐(虽然感觉都是人口普查分)
rk1是qjk %%%!!他好聪明 想到可以puts -1骗分 然后就90了
20:00 开始工作
Lucas定理先
简单来说——对于质数o,在nlogp的复杂度内处理出单个组合数%p的结果。
其中 Lucas(n, m) = C(n % p, m % p) * Lucas(n / p, m / p) % p
利用Lucas定理推导出,组合数为奇数的充要条件为n & m == m
由于值域范围小,开个桶记录之前的答案即可。
注意,作为开头,可以对后面的数额外贡献一次答案。
中国剩余定理——构造一次同余方程组的最小正整数解。
使用前提:模数(设为ai)两两互质。
一句话:先将模数全部乘起来得M,对于每个方程,用M / ai得到mi并求其在模ai意义下逆元ti,最后对所有的bi * mi * ti求和即可。对M取模即得最小正整数解。
求逆元:扩展欧几里得定理。仍然注意使用前提:
对一次方程 ax + by = c,其中 gcd(a, b) | c
这道题要求 mi * x + ai * y = 1(x为所求逆元)
显然mi, ai互质,即gcd(mi, ai) == 1,故满足使用条件。
得|x0| (特殊解)<= b,又欧几里得算法的通解可表示为:
x = x0 * c / d + k * b / d
y = y0 * c / d - k * a / d
其中 d = gcd(a, b)
本方程中 d == 1 则最小正整数解为 x = (x0 + t) % t
(实际上若d ≠ 1 则最小正整数解为 x = (x0 % t + t) % t
但有个疑惑:负数取模真不会出锅?)