zoukankan      html  css  js  c++  java
  • 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范围内的不多,可以处理好

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

  • 相关阅读:
    noip欢乐赛10.24 分火腿
    noip2014 无线网络发射器选址/wireless.
    noip2012 借教室 线段树最小值做法
    Codevs1021题解---SPFA+路径记录
    Vijos1448题解---线段树+括号法
    Vijos1425题解---栈
    Codevs1022题解---匈牙利算法
    人们总要为曾经的年轻买单
    2017-10-26
    2017-10-24LCA
  • 原文地址:https://www.cnblogs.com/absi2011/p/9480280.html
Copyright © 2011-2022 走看看