http://poj.org/problem?id=2154

还是先套上Burnside引理:$$\begin{aligned}

ans & =\sum_{i=1}^n n^{(i,n)-1} \

& = \sum_{d=1}^n [d|n]\sum_{i=1}^n [d|i]\left[\left(\frac id,\frac nd\right)=1\right]n^{d-1} \

& = \sum_{d=1}^n [d|n]n{d-1}\sum_{i=1}{\frac nd}\left[\left(i,\frac nd\right)=1\right] \

& = \sum_{d=1}^n [d|n]n^{d-1}\varphi\left(\frac nd\right)

\end{aligned}$$

因为n非常大,为了方便,求\(\varphi\)时进行质因子分解,求\(\varphi(d)\)单次\(O\left(\frac{\sqrt d}{\log d}\right)\),时间复杂度\(O\left(T\frac{n^{\frac 34}}{\log n}\right)\)。

我是这么写的,时间复杂度非常不科学。还有一种更快的\(O(1)\)求\(\varphi\)的做法,就是先欧拉筛\(\sqrt n\)以内的\(\varphi\)并且预处理n的大于\(\sqrt n\)的质因子\(p_{last}\)(如果有的话),求\(\varphi(d)\)时如果\(d>\sqrt n\),那么返回\(\varphi\left(\frac d{p_{last}}\right)*\left(p_{last} - 1\right)\),否则直接返回\(\varphi(d)\)。时间复杂度\(O\left(T\sqrt n\right)\)。

这么简单的题我竟然说了这么多。。。

#include<cmath>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 1000000003; int n, p, sq, num = 0, prime[100003];
bitset <100003> notp; void Euler_shai() {
for (int i = 2; i <= sq; ++i) {
if (!notp[i]) prime[++num] = i;
for (int j = 1; j <= num && prime[j] * i <= sq; ++j) {
notp[prime[j] * i] = 1;
if (i % prime[j] == 0)
break;
}
}
} int ipow(int a, int b) {
int ret = 1, w = a % p;
while (b) {
if (b & 1) (ret *= w) %= p;
(w *= w) %= p;
b >>= 1;
}
return ret;
} int PHI(int nu) {
int ret = 1;
for (int i = 1; i <= num && prime[i] <= nu; ++i)
if (nu % prime[i] == 0) {
(ret *= ((prime[i] - 1) % p)) %= p;
nu /= prime[i];
while (nu % prime[i] == 0) {
(ret *= (prime[i] % p)) %= p;
nu /= prime[i];
}
}
if (nu != 1) (ret *= ((nu - 1) % p)) %= p;
return ret;
} int work() {
sq = ceil(sqrt(n)); int ret = 0;
for (int i = 1; i < sq; ++i)
if (n % i == 0) {
(ret += ipow(n, i - 1) * PHI(n / i) % p) %= p;
(ret += ipow(n, n / i - 1) * PHI(i) % p) %= p;
}
if (sq * sq == n) (ret += ipow(n, sq - 1) * PHI(sq) % p) %= p;
return ret;
} int main() {
sq = sqrt(N);
Euler_shai(); int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &p);
printf("%d\n", work());
}
return 0;
}

【POJ 2154】Color的更多相关文章

  1. 【POJ 2154】 Color (置换、burnside引理)

    Color Description Beads of N colors are connected together into a circular necklace of N beads (N< ...

  2. 【POJ 2054】 Color a Tree

    [题目链接] http://poj.org/problem?id=2054 [算法] 贪心 [代码] #include <algorithm> #include <bitset> ...

  3. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  4. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  5. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  6. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  7. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  8. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  9. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

随机推荐

  1. 基于FPGA的HDTV视频图像灰度直方图统计算法设计

    随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期.与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter).去隔行 ...

  2. POJ 3069 Saruman's Army (模拟)

    题目连接 Description Saruman the White must lead his army along a straight path from Isengard to Helm's ...

  3. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院  欧浩源   Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽 ...

  4. 23、redis如何实现主从复制?以及数据同步机制?

    redis主从复制 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或 ...

  5. js_判断当前页面是否有网络和网络连接超时

    2018-04-12 方法一:通过navigator.onLine属性判断,返回true为有联网状态,false为断网状态. //方法一 if(navigator.onLine) { console. ...

  6. 项目记录 -- zfs get all [volume] python实现的数据构造

    zfs get all [volume]命令实现中构造数据结构 一.zfs get all [volume]命令源代码C实现中用到的数据结构有zprop_get_cbdata 和 callback_d ...

  7. ubuntu下调整cpu频率

    环境:ubuntu15.10 查看内核支持的cpu策略 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 比如我 ...

  8. 2017-2018-1 20179205《Linux内核原理与设计》第五周作业

    <Linux内核原理与设计>第五周作业 视频学习及操作分析 一.用户态.内核态和中断 内核态在CPU执行中对应高执行级别,执行级别为0级,具有特权指令,可以访问任意物理地址:用户态执行级别 ...

  9. JavaScript match() 方法

    match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. var st ...

  10. monkey测试===Monkey测试结果分析(系列三)转

    Monkey测试结果分析 一. 初步分析方法: Monkey测试出现错误后,一般的差错步骤为以下几步: 1. 找到是monkey里面的哪个地方出错 2. 查看Monkey里面出错前的一些事件动作,并手 ...