Project Eular 634

n特别大,咱们确定不能枚举每一个数统计

咱们思考一下思考

9e18 < 22 * (2e6)3枚举

那么要枚举b就好了

咱们枚举一发b,而后对于全部的b直接统计有多少a(利用sqrt)

唉为啥我Sample跑出来不对,3e6跑出来为啥比答案大一点

咱们通过观察,能够发现

咱们彷佛重复统计了一些东西

好比

43 * 272 = 93 * 82

那么咱们怎么办?

个人作法是,若是b带有平方因子,那么就忽略掉b的任何计算

这样咱们就统计出全部b不带平方因子的个数

那么若是b带平方因子,为了避免重复,它只能是一个质数的平方

例如4,9,25是能够的,8,18,16等都是不行的

咱们能够化简,例如163 * a2 = 43 * (8a)2

可是43 * 272 也一样化简就会变成这个样子:

13 * (8*27)2

因此咱们只有43 * 272这种没有统计,其余的咱们都统计过了,并且没有重复的统计过了

那么这里我只能容斥来作了,统计有多少个合法的解

由于以前的作法,(2*3)6就被统计了2次,而(2*3*5)6就被统计了3次,这里就须要容斥处理掉这些

甚至这个4*(2*3)6也被统计了2次,一次是43 * 542,一次是93 * 162

那么咱们只能用容斥,对于每个东西的6次方作容斥

固然6次方还在n范围内的很少,能够处理好

代码丢家里系列,下次回家补....

相关文章
相关标签/搜索