题意:现在有一个函数,
给出p和k,问这种函数有多少个。
思路:并查集,对于一个函数值,如果确定它,那么就可以确定所有和它有关系的函数值,用并查集维护一下即可。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
//const int MAXN = 5000000 + 5;
//const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n;
LL p, k;
set<LL> s;
LL fa[1000100];
int Find(LL x) {
if(x != fa[x]) return fa[x] = Find(fa[x]);
return x;
}
int cnt[1001000];
int main() {
//freopen("input.txt", "r", stdin);
cin >> p >> k;
s.insert(0);
LL ans = 1;
if(k==0) {
for(int i = 1; i < p; i++) ans = ans * p % mod;
cout << ans;
return 0;
}
for(int i = 0; i < p; i++) fa[i] = i;
for(int i = 0; i < p; i++) {
LL shit = k * i % p;
int x1 = Find(i), x2 = Find(shit);
fa[x1] = x2;
}
for(int i = 0; i < p; i++) {
int z = Find(i);
cnt[z]++;
}
for(int i = 1; i < p; i++)
if(cnt[i]) ans = ans * p % mod;
if(k == 1) ans = ans * p % mod;
cout << ans;
return 0;
}