【POJ 2154】Color
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的更多相关文章
- 【POJ 2154】 Color (置换、burnside引理)
Color Description Beads of N colors are connected together into a circular necklace of N beads (N< ...
- 【POJ 2054】 Color a Tree
[题目链接] http://poj.org/problem?id=2054 [算法] 贪心 [代码] #include <algorithm> #include <bitset> ...
- 【POJ 2777】 Count Color(线段树区间更新与查询)
[POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4094 ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
随机推荐
- TOJ 1005 Hero In Maze (深搜)
描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他知道公主在迷宫 ...
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- CTSC/APIO2018 帝都一周游
day0 报道 上午早早就起来了,两点才到酒店,然后去简单试了试机子. 不得不说今年八十中的伙食变得瓜皮了啊,去年还是大叠的5元卷,今年变成了单张的*餐卷.不知道食堂吝啬什么,面条米饭都只有一点点,还 ...
- shellcheck 帮助你写出更好的脚本
简介 shellcheck 是一款实用的 shell脚本静态检查工具. 首先,可以帮助你提前发现并修复简单的语法错误,节约时间.每次都需要运行才发现写错了一个小地方,确实非常浪费时间. 其次,可以针对 ...
- CiteSeer统计的计算机领域的期刊和会议的影响因子(2005)
产生自CiterSeer 2005数据库,实际的影响因子可能更高.仅供参考使用.真实的IF还需去官网查看 . OSDI: 3.31 (top 0.08%) . USENIX Symposium on ...
- Timer类
构造方法:public Timer() 创建一个新计时器.相关的线程不 作为守护程序运行. public Timer(boolean isDaemon) 创建一个新计时器,可以指定其相关的线程作为守护 ...
- Mac 使用自带的Ruby 安装brew
Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载软件. 首先要安装brew,在 mac 中使用finder 搜索 终端(terminal)打开命令行 ...
- linux命令(21):more命令
实例1:显示文件中从第3行起的内容 [root@host-172-168-80-55 home]# cat test.log aaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb ...
- Python+Selenium 自动化实现实例-Css捕捉元素的几种方法
#coding=utf-8 from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("h ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...