【CF360D】Levko and Sets 题解

题目大意

       n 个数 a1...an m 个数 b1...bm 和一个质数 p
       i 个集合是这样生成的:一开始只有一个 1。每次找集合内的一个元素 c 和一个下标 j (j[1,m]),若 c×abji mod p 不在集合里,则加进去。
       求这 n 个集合的并集大小。
      n1e4 m1e5 ai<p1e9 bi<1e9
       时限 3s。

题解

       极好的数论题。

       i 个集合实际上是 abi。( b 是指 kjbj kjZ
       由扩展欧拉定理,指数是模 p1 意义下的。设 B=gcd(b1,b2,...,bm,p1) ,则 b 等价于 kB (kZ) 。(你可以用 polya 那套理论来理解这个道理,当只有一个 b 的时候可证它是 gcd,当有多个 b 的时候,合并两个 b 可以看作是其中一个模另一个,因此也是 gcd。)

      底数不同于是用原根来表示,设 ai=gAi ,则第 i 个集合表示为 gAikB
       由于 B 是定值,Ai 可以直接视为 Ai×B ,也相当于一开始把 ai 视为 aBi 。那么现在第 i 个集合就相当于 gkAi
       同理,设 Ai=gcd(Ai,p1) ,则第 i 个集合相当于 gkAi

       现在就相当于有一堆 Ai ,它们都是 p1 的约数。求模 p1 意义下有多少数是某个 Ai 的倍数。
       这就可以容斥 dp 了。把 Ai 去重并从大到小排序,然后一个个计算贡献。这里用 O(n2) 的算法就可以了。

       Ai 有很多种方法。传统方法是先求出原根 g ,然后求 Ai,再求 Ai 。当然也有很方便的方法:第 i 个集合的大小也是 p1 的约数,设为 di=p1Ai 。由于 Ai 是最大公约数,所以要最小化 di ,即找到最小的 di 使得 adii1 (这里的 ai 是指 aBi )。

代码

//直接上cf找,都很短很好理解,比如 tourist_2 的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值