/*
Time:2019.12.15
Author: Goven
type:Polya定理+欧拉函数
ref:
[知识点]
Burnside引理 + Polya定理 :
https://blog.csdn.net/WhereIsHeroFrom/article/details/79631703
https://blog.csdn.net/liangzhaoyang1/article/details/72639208
https://blog.csdn.net/qq_33765907/article/details/51307937
欧拉定理:
https://blog.csdn.net/ydd97/article/details/47805419
https://blog.csdn.net/zxwsbg/article/details/81488956
[代码]
https://blog.csdn.net/acdreamers/article/details/8656247
https://www.cnblogs.com/AKCqhzdy/p/7598571.html
[总结]
https://blog.csdn.net/My_ACM_Dream/article/details/45312365
*/
#include<iostream>
#include<cstring>
#define MAXN 100005
using namespace std;
bool isprime[MAXN];
int prime[MAXN];
int cnt;
void getPrimeTable () {
cnt = 0;
memset(isprime, true, sizeof(isprime));
for (int i = 2; i < MAXN; i++) {
if (isprime[i]) {
prime[cnt++] = i;
for (int j = i + i; j < MAXN; j += i) {
isprime[j] = false;
}
}
}
}
int phi (int n, int mod) {//欧拉函数
int res = n;
for (int i = 0; prime[i] * prime[i] <= n && i < cnt;i++) {
if (n % prime[i] == 0) {
res -= res / prime[i];
while (n % prime[i] == 0) n /= prime[i];
}
}
if (n > 1) res -= res / n;
return res % mod;
}
int quick_mod (int a, int b, int mod) {
a %= mod;
int res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main()
{
getPrimeTable();
int t, n, p;
cin >> t;
while (t--) {
cin >> n >> p;
int res = 0;
for (int i = 1; i * i <= n; i++) {
if (i * i == n) {
res = (res + quick_mod(n, i - 1, p) * phi(i, p)) % p;
}
else if (n % i == 0) {
res = (res + quick_mod(n, i - 1, p) * phi(n / i, p) + quick_mod(n, n / i - 1, p) * phi(i, p)) % p;
}
}
cout << res << endl;
}
return 0;
}
poj2154 Polya定理+欧拉函数
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 前文再续,书接上一回,我们说到费尔马小定理,这里我们...... Mod数为合数时的算术运算 同样的Python代...
- 前几天,64岁的任达华在中山出席某商业活动意外被刺,之后送往当地医院接受治疗。消息一出,不少网友纷纷关注。毕竟这事...