题解:P13953 [ICPC 2023 Nanjing R] 原根
题解:P13953 [ICPC 2023 Nanjing R] 原根
题目
给定质数 \(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 \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}\),得:
代入上边的三个式子,就可以推广成:
考虑 \(g\) 的上下界。因为 \(ax \equiv 1 \pmod{p}\) 可以写成 \(ax=kn+1 \ (k \in \mathbb{Z})\) 的形式。所以原式可以化为:
移项,得:
由 \(a-b \le a \oplus b \le a + b\),整理得:
分析 \(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\),所以:
令 \(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;
}

浙公网安备 33010602011771号