您的位置:首页 > 其它

Codeforces Round #334 (Div. 2) D. Moodular Arithmetic

2015-12-11 23:12 274 查看

题意:

求有多少种映射关系满足等式:



思路:

假设K=0,K=1 情况下,答案比较容易得到。

对于 K≥2 情况下。具体解释:here

下面说明几点疑惑:

为什么选用 x2=x1∗p % mod,因为这样的额话,满足迭代条件,所以就能找到等式关系。

为什么mark过的数就不用再去找了?因为只要在循环节内的话,只要选定x1 后,那么由于之前寻找的等式必须满足,所以在环内的数的值也就随之确定了!所以整个环内的数有 p 中取值。

应该解释清楚了吧!

代码:

#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";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces