本题正确性较好的能通过做法
查看原帖
本题正确性较好的能通过做法
365021
masterhuang楼主2024/1/23 21:20

题解有空补,咕咕咕。

卡常科技:Binary Jacobi

前置知识:Binary gcd\texttt{Binary gcd}。

  • 科技用于快速计算模大素数的二次剩余。经 EI 提示探索发现。

  • long long 大素数下对比是快速幂直接做的 1/31/3,和 Binary gcd\texttt{Binary gcd} 一样优化明显。

下文 (pq)\left(\dfrac{p}{q}\right) 为 Jacobi\text{Jacobi} 符号。

原理(部分证明)参见这里。

令 pp 为正整数,a,ba,b 为与 pp 互素的整数,有结论:

  • 乘法结合:(ap)×(bp)=(abp)\left(\dfrac{a}{p}\right)\times \left(\dfrac{b}{p}\right)=\left(\dfrac{ab}{p}\right)

  • (2p)=(−1)p2−18\left(\dfrac{2}{p}\right)=(-1)^{\frac{p^2-1}{8}}

  • 二次互反律:当 p,qp,q 为奇数且 (p,q)=1(p,q)=1 时,(pq)×(qp)=(−1)(p−1)(q−1)4\left(\dfrac{p}{q}\right)\times \left(\dfrac{q}{p}\right)=(-1)^{\frac{(p-1)(q-1)}{4}}


欲求 (pq)\left(\dfrac{p}{q}\right),其中 qq 为奇数,pp 为与 qq 互素的任意数。

设 p=2mkp=2^mk,则 (pq)=(2q)m×(kq)=(−1)m(q2−1)8×(kq)\left(\dfrac{p}{q}\right)=\left(\dfrac{2}{q}\right)^m\times \left(\dfrac{k}{q}\right)=(-1)^{\frac{m(q^2-1)}{8}}\times \left(\dfrac{k}{q}\right)。

用二次互反律:(pq)=(−1)m(q2−1)8×(−1)(k−1)(q−1)4×(qk)\left(\dfrac{p}{q}\right)=(-1)^{\frac{m(q^2-1)}{8}}\times(-1)^{\frac{(k-1)(q-1)}{4}}\times \left(\dfrac{q}{k}\right)。

递归下去即可,复杂度类似 gcd\text{gcd} 的复杂度,为 O(log⁡V)O(\log V),但是常数极小,快速幂 30s30s 的这个 4s−4s^-。

#define mytz __builtin_ctzll
inline bool jac(ull a,ull b)
{
	bool ans=0;
	while(1)
	{
		a%=b;if(a==1) return ans;
		short az=mytz(a),o=az&1&(((b*b-1)&15)!=0);a>>=az;
		ans^=o;if(a==1) return ans;
		ans^=((((a-1)*(b-1))&7)!=0);swap(a,b);
	}return ans;
}

本题做法同大众做法,只是把素数增大了保证正确性,实测没有这个优化你根本过不去。

本题代码实现。

2024/1/23 21:20
加载中...