题解:P13953 [ICPC 2023 Nanjing R] 原根

题解:P13953 [ICPC 2023 Nanjing R] 原根

Link

题目

给定质数 \(p\) 和非负整数 \(m\),有多少非负整数 \(g\) 满足 \(g \leq m\)\(g \oplus (p-1) \equiv 1 \pmod{p}\)

  • \(1 \leq T \leq 10^{5}\)\(2 \le P \le 10^{18}\)\(0 \leq m \leq 10^{18}\)\(P \in \mathbb{P}\)

有这样一个定理\(a-b \le a \oplus b \le a + b\)

考虑证明:当 \(a,b \in \left\{ 0,1 \right\}\) 时,显然有 \(a-b \le a \oplus b \le a + b\)

那么一般情况呢?可以考虑二进制分解 \(a,b\)

这时 \(a=\sum_{i=1}^n 2^{i} a_{i}\)\(b=\sum_{i=1}^n 2^{i} b_{i}\)。则:

\[a+b= \sum_{i=1}^n 2^{i} a_{i} + \sum_{i=1}^n 2^{i} b_{i}=\sum_{i=1}^n 2^{i} (a_{i}+b_{i}) \]

\[a-b= \sum_{i=1}^n 2^{i} a_{i} - \sum_{i=1}^n 2^{i} b_{i}=\sum_{i=1}^n 2^{i} (a_{i}-b_{i}) \]

\[a \oplus b= \sum_{i=1}^n 2^{i} a_{i} \oplus \sum_{i=1}^n 2^{i} b_{i}=\sum_{i=1}^n 2^{i} (a_{i} \oplus b_{i}) \]

这就转化成了 \(a,b \in \left\{ 0,1 \right\}\) 时的特殊情况。因为 \(a-b \le a \oplus b \le a + b \ (a,b \in \left\{ 0,1 \right\})\),不等式三遍同乘 \(\sum_{i=1}^n 2^{i} a_{i}\),得:

\[\sum_{i=1}^n 2^{i} (a_{i}-b_{i}) \le \sum_{i=1}^n 2^{i} (a_{i} \oplus b_{i}) \le \sum_{i=1}^n 2^{i} (a_{i} \oplus b_{i}) \]

代入上边的三个式子,就可以推广成:

\[a-b \le a \oplus b \le a + b \]

考虑 \(g\) 的上下界。因为 \(ax \equiv 1 \pmod{p}\) 可以写成 \(ax=kn+1 \ (k \in \mathbb{Z})\) 的形式。所以原式可以化为:

\[g \oplus (p-1) = kp+1 \]

移项,得:

\[g = (kp+1) \oplus (p-1) \]

\(a-b \le a \oplus b \le a + b\),整理得:

\[(k-1)p+2 \le g \le (k+1)p\tag{1} \]

分析 \(k\) 的上下界。我们不妨研究一下 \(\left \lfloor \frac{m}{p} \right \rfloor-1,\left \lfloor \frac{m}{p} \right \rfloor,\left \lfloor \frac{m}{p} \right \rfloor+1\) 这三个边界数。

因为 \(\left \lfloor \frac{m}{p} \right \rfloor \le \frac{m}{p} < \left \lfloor \frac{m}{p} \right \rfloor + 1\),所以:

\[\left \lfloor \frac{m}{p} \right \rfloor \cdot p \le m < \left( \left \lfloor \frac{m}{p} \right \rfloor+1 \right) \cdot p \tag{2} \]

\(k \le \left \lfloor \frac{m}{p} \right \rfloor-1\)。此时有 \((k+1)p \le \left \lfloor \frac{m}{p} \right \rfloor \cdot p \le m\)。在上文我们推出来了 \(g \le (k+1)p\),所以此时 \(g \le m\)。注意 \(k \ge 1\)。因为 \(k=0\) 时一次项就被消掉了。

\(k=\left \lfloor \frac{m}{p} \right \rfloor\) 时,将 \(\left \lfloor \frac{m}{p} \right \rfloor\) 代入 \((1)\),得 \(g \le \left( \left \lfloor \frac{m}{p} \right \rfloor+1 \right)p\),又因为 \((2)\)\(m < \left( \left \lfloor \frac{m}{p} \right \rfloor+1 \right) \cdot p\),所以此时通过 \(g = (kp+1) \oplus (p-1)\) 算出 \(g\),和 \(m\) 比较即可。

\(k = \left \lfloor \frac{m}{p} \right \rfloor+1\) 时,同理代入 \((1)\),得到 \(g \le \left \lfloor \frac{m}{p} \right \rfloor \cdot p + 2 \le \left (\left \lfloor \frac{m}{p} \right \rfloor+2\right) \cdot p\)。此时同样将 \(k = \left \lfloor \frac{m}{p} \right \rfloor+1\) 代入 \(g = (kp+1) \oplus (p-1)\),怕断是否符合条件即可。

考虑 \(k> \left \lfloor \frac{m}{p} \right \rfloor+1\)。此时 \(k-1 \ge \left \lfloor \frac{m}{p} \right \rfloor+1\),即 \(g \ge \left(\left \lfloor \frac{m}{p} \right \rfloor+1\right)p+2\)。联立 \(m< \left( \left \lfloor \frac{m}{p} \right \rfloor+1 \right) \cdot p\),此时必定 \(g>m\),不满足条件。

总上所述。只需要判断 \(k\) 是否满足这三个条件,枚举 \(k\) 累加即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T,p,m;
int main(){
	cin>>T;
	while(T--){
		cin>>p>>m;
		ll cnt=0;
		if(m/p>=1) cnt+=m/p;
		if((((m/p)*p+1)^(p-1))<=m) cnt++;
		if(m>=(m/p)*p+2&&m>=(((m/p+1)*p+1)^(p-1))) cnt++;
		cout<<cnt<<"\n";
	}
	return 0;
}
posted @ 2025-09-07 21:19  M1_Byte  阅读(14)  评论(0)    收藏  举报