【NOI 2016模拟6.16】gene

26 篇文章 0 订阅
3 篇文章 0 订阅

题目描述

你有 n 个数{a1,,an},以及 m 个数{b1,,bm}

对于任意一个 ai ,你可以任意选择任意多个 abii 乘起来对 p 取模,得到若干个数。
问所有这样子得到的数的并集大小。

n104,m105,1<p109,且 p 是个质数。


分析

首先abji是会被取到的,只需要取循环节的上一个就可以了。

那么根据裴蜀定理, x[0,p1),(b0,b1,,bm,p1)|x 都可以被取到。

考虑到如此多个 ai 取并集不好做,那么求出离散对数以后,这个底数都会变成原根。问题就放到指数上了。

也就是说,我们记 (ind(ai),b1,,bm,p1)=ci
考虑怎么计算这个 ci 。根据最大公约数的性质,这个东西等价于 (ind(ai),(b1,,bm,p1))
ind(x) 可以用离散对数算出来,但是考虑到这里我们需要求它和别的东西的最大公约数,我们没必要真的算出离散对数。

考虑 x 的阶ord(x),根据定义, ind(x)ord(x)0(modφ(p)) ,也就是说 ind(x)=kφ(p)ord(x) ,且 ord(x) k 互质。

考虑费马小定理aφ(p)1(modp),那么 ord(x) 必定是 φ(p) 的约数。

下证 (ind(x),φ(p))=(φ(pord(x),φ(p))=φ(p)ord(x)

左式可以如下变换。

(ind(x),φ(p))=(ind(x)ord(x),ord(x)φ(p))ord(x)=(kφ(p),ord(x)φ(p))ord(x)=φ(p)(k,ord(x))ord(x)

由于 (k,ord(x))=1 ,故左式等于右式。

有了这个以后,我们就可以在这个问题里将阶来取代离散对数起到相同的作用。

之后的问题就是给定 n ci,问有点多少个数至少是一个 ci 的倍数。
形式化地说,我们需要统计有多少个 x ,满足

x[0,φ(p)),i,ci|x

又因为 ci|n ,故 ci|(n,x)

那么我们就可以枚举最大公约数,剩下的式子就是

d=1n[i,ci|d]φ(nd)

时间复杂度 O(mlogbi+σ0(p)nlogp+nlnn)
空间复杂度 O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值