zoukankan      html  css  js  c++  java
  • [HAOI2008]圆上的整点

    x * x + y * y = r * r

    的(正整数解 + 1) << 2

    两种方法:

      wiki一下勾股数有一个不假证明的参数方程组,消元变成了2元

    另一种方法:

      (r - x)(r + x) = y * y

      d = gcd (r - x, r + x)    y * y = d * (u * u * v * v)

      2 * r = d * (u * u + v * v)

      利用最后一个狮子:枚举2r的约数,枚举约数的uv分解(有方向).

    我是抄的 你也去抄一份吧
     1 #include <cstdio>
     2 #include <cmath>
     3 long long r;
     4 inline long long gcd (long long a, long long b) { return b == 0 ? a : gcd (b, a % b); }
     5 inline long long sol (long long d)
     6 {
     7     long long z (0), n (2 * r / d);
     8     for (long long u = 1; u * u <= n; u ++)
     9     {
    10         long long t = n - u * u;
    11         long long v = (long long)sqrt (t + 0.5);
    12         if (u >= v) break;
    13         if (u * u + v * v == n && gcd (u, v) == 1)
    14             z ++;
    15     }
    16     return z;
    17 }
    18 int main ()
    19 {
    20     scanf ("%d", &r);long long ans (1), n (2 * r);
    21     for (long long i = 1; i * i <= n; i ++)
    22         if (n % i == 0)
    23         {
    24             ans += sol (i);
    25             if (i * i == n) break;
    26             ans += sol (n / i);
    27         }printf ("%lld\n", ans << 2);
    28     return 0;
    29 }
  • 相关阅读:
    实现JSON数据的存储和读取
    MediaPlayer类——播放视频和音乐
    网络编程浅析
    线程浅析
    I/O浅析
    fragment之间的信息交互——onActivityResult()不经过Activity
    命名规则
    String方法(一)
    面试小结
    找工作中......
  • 原文地址:https://www.cnblogs.com/tellmewtf/p/2909331.html
Copyright © 2011-2022 走看看