原来是有一篇文的 但是LaTeX渲染压力够大了不想加东西了 干脆开个新坑
刚好之前XOI2003最后一题出了个被出烂的idea 算是提醒一下自己别再弄板子题了吧
说句闲话,码农教程司马
前置知识:
扩展欧拉定理:
b
≥
φ
(
p
)
时
,
a
b
≡
a
b
m
o
d
φ
(
p
)
+
φ
(
p
)
(
m
o
d
p
)
b\ge \varphi(p)时,a^b\equiv a^{b \bmod \varphi(p)+\varphi(p)}\pmod p
b≥φ(p)时,ab≡abmodφ(p)+φ(p)(modp)
(显然
b
<
φ
(
p
)
b<\varphi(p)
b<φ(p) 时无需变化)
洛谷P4139 上帝与集合的正确用法
题意:求
2
2
2
⋯
m
o
d
p
\Large 2^{2^{2^{\cdots}}}\bmod p
222⋯modp 的值
就是板子,用扩展欧拉定理递归求解(也可转化为递推)即可
递归边界就是
p
=
1
p=1
p=1 ,答案显然为0
考虑这样一件事:对于偶数
p
p
p ,
φ
(
p
)
≤
p
2
\varphi(p)\le\dfrac p2
φ(p)≤2p 成立(偶数全部被排除);对于奇数
p
p
p ,考虑计算公式:
φ
(
x
)
=
x
×
∏
i
=
1
m
(
1
−
1
p
i
)
\varphi(x)=x\times\prod\limits_{i=1}^m(1-\dfrac 1{p_i})
φ(x)=x×i=1∏m(1−pi1) (
p
1
∼
m
p_{1\sim m}
p1∼m 为
x
x
x 的质因子,
x
x
x 为奇数)
发现
1
−
1
p
i
=
p
i
−
1
p
i
1-\dfrac 1{p_i}=\dfrac{p_i-1}{p_i}
1−pi1=pipi−1 ,于是易 证
φ
(
x
)
\varphi(x)
φ(x) 必为偶数(读者自证不难)
那么我们就发现递归(递推)求解层数是log级的,时间复杂度就不虚了
我用线性筛预处理了一下
φ
\varphi
φ ,感觉直接爆算可能不怎么快
反正时间复杂度是
Θ
(
P
+
T
log
p
)
\Theta(P+T\log p)
Θ(P+Tlogp) ,本题中
P
=
1
e
7
P=1e7
P=1e7
写代码的时候突然意识到递推并不好写。。写个递归算了 反正也不慢
qnmd线性筛
A掉之后翻了一下提交记录 突然发现直接算欧拉函数速度会快很多
一方面是理论上运算次数少了 另一方面是没有访问数组,常数也小了不少
所以还是放新代码吧
#include<cstdio>
int T,s,a,cnt,p;
int phi(int x) {
int t=x;
for (int i=2; i*i<=x; ++i)
if (x%i==0) {
while (x%i==0) x/=i;
t=t/i*(i-1);
}
x>1&&(t=t/x*(x-1));
return t;
}
inline int _power(int x,int y,int p) {
int ans=1;
while (y) (y&1)&&(ans=1ll*ans*x%p),x=1ll*x*x%p,y>>=1;
return ans;
}
int f(int p) { return p==1?0:_power(2,f(phi(p))+phi(p),p); }
int main() {
for (scanf("%d",&T); T; --T)
scanf("%d",&p),printf("%d\n",f(p));
return 0;
}
CF906D Power Tower
和上题很类似
坑回头填