欧拉降幂欧拉定理子序列权值乘积

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉降幂欧拉定理子序列权值乘积相关的知识,希望对你有一定的参考价值。

前置知识

欧拉定理

g c d ( a , m ) = 1 gcd(a,m)=1 gcd(a,m)=1,则 a φ ( m ) ≡ 1 ( m o d m ) a^\\varphi(m) \\equiv 1 \\pmodm aφ(m)1(modm)

扩展欧拉定理

a b ≡ a b   m o d   φ ( m ) , gcd ⁡ ( a , m ) = 1 , a b , gcd ⁡ ( a , m ) ≠ 1 , b < φ ( m ) , a ( b   m o d   φ ( m ) ) + φ ( m ) , gcd ⁡ ( a , m ) ≠ 1 , b ≥ φ ( m ) . ( m o d m ) a^b \\equiv \\begincases a^b \\bmod \\varphi(m), &\\gcd(a,m) = 1, \\\\ a^b, &\\gcd(a,m)\\ne 1, b < \\varphi(m), \\\\ a^(b \\bmod \\varphi(m)) + \\varphi(m), &\\gcd(a,m)\\ne 1, b \\ge \\varphi(m). \\endcases \\pmod m ababmodφ(m),ab,a(bmodφ(m))+φ(m),gcd(a,m)=1,gcd(a,m)=1,b<φ(m),gcd(a,m)=1,bφ(m).(modm)

费马小定理

p为素数, g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,则 a p − 1 ≡ 1 ( m o d p ) a^p - 1 \\equiv 1 \\pmodp ap11(modp)

注:若m为素数,则 φ ( m ) = m − 1 \\varphi(m) = m-1 φ(m)=m1


题目

题目链接:
https://ac.nowcoder.com/acm/contest/23479/G

给一个数组,求数组所有非空子序列的权值之积。
数组的权值:数组中的最大值乘最小值


长度为n的数组,有 2 n − 1 2^n-1 2n1个非空子序列,枚举必然超时。

将数组排序,当排序了以后,如果确定了最大值和最小值,它们中间的数取不取对结果是没有影响的。

因此,通过这种方式可以枚举最大值和最小值,中间的部分规约在一起,利用欧拉降幂进行计算,这样复杂度为 O ( n 2 l o g n ) O(n^2logn) O(n2logn),这样还是不够。

如果区间长度 ( r − l + 1 ) (r-l+1) (rl+1) k k k ,那么中间的数有【】或【不取】两种状态,因此有 2 k − 2 2^k-2 2k2的权值贡献。

对于长度固定的情况,那么贡献的次数固定。这部分可以利用乘法分配律合并起来。

这样最终只需要枚举区间长度就可以。

举例

以长度为5的数组举例 [ 1 , 2 , 3 , 4 , 5 ] [1,2,3,4,5] [1,2,3,4,5],假设已经排好序

  • 枚举长度 2,最终带来的权值收益是

( 1 ∗ 2 ) 2 0 ∗ ( 2 ∗ 3 ) 2 0 ∗ ( 3 ∗ 4 ) 2 0 ∗ ( 4 ∗ 5 ) 2 0 (1*2)^2^0*(2*3)^2^0*(3*4)^2^0*(4*5)^2^0 (12)20(23)20(34)20(45)20

  • 枚举长度 3,最终带来的权值收益是

( 1 ∗ 3 ) 2 1 ∗ ( 2 ∗ 4 ) 2 1 ∗ ( 3 ∗ 5 ) 2 1 (1*3)^2^1*(2*4)^2^1*(3*5)^2^1 (13)21(24)21(35)21

  • 枚举长度 4,最终带来的权值收益是

( 1 ∗ 4 ) 2 2 ∗ ( 2 ∗ 5 ) 2 2 (1*4)^2^2*(2*5)^2^2 (14)22(25)22

  • 枚举长度 5,最终带来的权值收益是

( 1 ∗ 5 ) 2 3 (1*5)^2^3 (15)23

根据公式 a t ∗ b t = ( a ∗ b ) t a^t*b^t=(a*b)^t atbt=(ab)t ,这些幂相同的底数都是可以合并的。

合并之后:

l e n = 2 len=2 len=2时, ( 1 ∗ 2 2 ∗ 3 2 ∗ 4 2 ∗ 5 ) 2 0 (1*2^2*3^2*4^2*5)^2^0 (12232425)20
l e n = 3 len=3 len=3时, ( 1 ∗ 2 ∗ 3 2 ∗ 4 ∗ 5 ) 2 1 (1*2*3^2*4*5)^2^1 (123245)21
l e n = 4 len=4 len=4时, ( 1 ∗ 2 ∗ 4 ∗ 5 ) 2 2 (1*2*4*5)^2^2 (1245)22
l e n = 5 len=5 len=5时, ( 1 ∗ 5 ) 2 3 (1*5)^2^3 (15)2以上是关于欧拉降幂欧拉定理子序列权值乘积的主要内容,如果未能解决你的问题,请参考以下文章

[欧拉降幂][2019南京网络赛B]super_log

欧拉函数&欧拉定理&降幂 总结

[数学][欧拉降幂定理]Exponial

扩展欧拉定理降幂

[扩展欧拉定理例题]降幂大法

浅谈 欧拉降幂