[BZOJ1041数論]

分析
点の数(x、y)を満足を求めるX2 + Y2 = R2

もちろん、答えは、同じ数4つの象限対称的です。
rは整数であり、4つの軸は、全体のポイントです。
ANSは第1象限に配置された点の数であり、結果は4 * ANS + 4です。

今、我々は、(X> 0、Y> 0)、次いで、Y = SQRT((RX)(R + X))と仮定します

D = GCDを設定する((R + X )、(RX))は
、それは明らかである(R + X)/ dおよび(RX)/ D互いに素。
集合A =(RX)/ D、 B =(R + X)/ Dが
RX = AD、Rは、x = +である BDは
、次に、Y2 = d2AB式にそれをもたらす
、すなわち、(Y / D)2 = AB
Xため!= 0、A!= B.
したがって、A及びBは、正方形の数、即ち、A = A2、B = B2です。
したがってA2 + B2 =(2R)/ D およびGCD(A、B)== 1

A = RX、B = Rので+ X、 <Bとなるよう。
従ってA2 <R / D

その後、我々は、条件があることができるかどうかを決定するために、Bを取得し、AおよびDを列挙する。

なお、側面、すなわち、(2R)/ DおよびDの両方を有する場合、Dの列挙。

#include <ビット/ STDC ++。H>
の#define SC(N)のscanf( "%d個"、&N)
の#define PT(N)のprintf( "%d個の\ n"、N)
の#define担当者(I、B I ++); I <= B;)(I = int型のため
の#define VIベクトル<整数>
長い長い> <の#define VLベクター
の#define PB一back
名前空間stdを使用。
typedefの長い長いLL。
R LL、ANS = 0。
ボイドワーク(LLのK)
{
(= 1 LL; * <K / 2; ++)用
{
っ今= KA *。
LL B = SQRT(今)。
もし(b *表B =今!)続けます。
もし(__ GCD(a、b)は== 1)++ ANS;
}
}
int型のmain()
{
scanf関数( "%のLLD"、&R)。
用(; D * D <= 2 * R、LLのD = 1、D ++)
{
IF(2 * R%dの== 0)
{
ワーク(2 * R / D)。

}
}
のprintf( "%LLDする\ n"、4 * ANS + 4)。
0を返します。
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

---------------------

おすすめ

転載: www.cnblogs.com/hyhy904/p/11109110.html