欧拉降幂
扩展欧拉定理:
ab≡⎩⎨⎧abmodφ(m),ab,abmodφ(m)+φ(m),a⊥ma⊥m,b<φ(m)a⊥m,b≥φ(m)(modm)
运用欧拉定理 ∀a⊥m,ab≡abmodφ(m)(modm),可以将上式简化为:
ab≡{ab,abmodφ(m)+φ(m),b<φ(m)b≥φ(m)(modm)
考虑幂塔方程 abcde(modm) 这种东西,我们可以递归求解,每一层就是套了一层 φ,不断套 φ 的复杂度其实是 Θ(logm)。
所以我们套了几步之后就变成了 mod 1,此时就可以返回,加上快速幂的复杂度为 Θ(log2m),可以提前预处理 φ(m),φ(φ(m)),⋯,使用根号求 φ 即可。
给定一个数列 w1,w2,...,wn 和模数 p,每次询问一个区间 [l,r] 求 wlwl+1wl+2...wr(modp)。
n≤105。
套用模板即可,注意快速幂的写法不一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ll ksm(ll a,ll n,ll p) { auto mo=[&](ll a) {return a>p?a%p+p:a;}; ll res=1;for(;n;n>>=1,a=mo(a*a)) if(n&1) res=mo(res*a); return res; } ll dfs(ll c) { if(c>r-l||ph[c]==1) return 1; return ksm(a[l+c],dfs(c+1),ph[c]); } ph[0]=p;F(i,1,1e3) if(ph[i-1]^1) ph[i]=phi(ph[i-1]);else break; F(i,1,read()) { l=read();r=read(); printf("%lld\n",dfs(0)%p); }
|
给定 p,求 222⋯(modp) 收敛于什么值。
p≤107。
套用模板即可。
有一个很容易产生的误区就是我以为可以初始令 a=2,然后每次令 a←2amodp,若 a=2a 则结束。
但是你取 p=7 发现根本没有这种值。
事实上我们错在每次对 p 取模,这也表明了遇到类似的题一定要看清楚是 a←2amodp 还是 a←2a 最后 mod p。
维护一个长度为 n 的数组。
一共有 m 个操作:
0 l r 表示将第 l 个到第 r 个数中的每一个数赋值 ai=cai。
1 l r 求第 l 个到第 r 个数的和,也就是输出: ∑i=lrai
输出结果 mod p 的值。
n,m≤5×104。
套用模板即可,势能线段树。
Θ(nlog3n) 难以通过,考虑模数种类很少,且底数唯一,光速幂优化即可。