题意:
求有多少种映射关系满足等式:
![]()
思路:
假设 K=0 , K=1 情况下,答案比较容易得到。
对于 K≥2 情况下。具体解释:here
下面说明几点疑惑:
- 为什么选用 x2=x1∗p % mod ,因为这样的额话,满足迭代条件,所以就能找到等式关系。
- 为什么mark过的数就不用再去找了?因为只要在循环节内的话,只要选定 x1 后,那么由于之前寻找的等式必须满足,所以在环内的数的值也就随之确定了!所以整个环内的数有 p <script type="math/tex" id="MathJax-Element-1260">p</script> 中取值。
应该解释清楚了吧!
代码:
#include <bits/stdc++.h>
using namespace std;
int p, k, seen[1000100];
void dfs(int node) {
int next = (int)((node * 1LL * k) % p);
seen[node] = 1;
if(not seen[next]) {
dfs(next);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> p >> k;
int tot = 0;
for(int i = 1; i < p; i++) {
if(not seen[i]) {
tot++;
seen[i] = 1;
dfs(i);
}
}
long long ans = 1;
for(int i = 0; i < tot; i++) {
ans *= p;
ans %= 1000000007;
}
if(k == 1) {
ans *= p;
ans %= 1000000007;
}
cout << ans << "\n";
}