1 条题解

  • 0
    @ 2022-6-2 16:32:13

    本题做法很多,如果你想到了O(n)O(n)的做法,可以练习出题人DengDuck

    邮箱:moudengya123@qq.com

    这可以让DengDuck出更强的数据,同时在加强版的题面上也会感谢您

    简化题意

    大家都知道勾股定理吧,对于一个直角三角形,两直角边平方之和等于斜边的平方

    式子表示为a2+b2=c2a^2+b^2=c^2

    其实还有一个勾股逆定理,若三角形满足a2+b2=c2a^2+b^2=c^2,三角形为直角三角形

    所以本题可以理解为

    已知正整数nn,求

    $$\begin{cases} x^2+y^2=z^2\\ x<y<z \leq n \end{cases} $$

    的所有正整数解

    O(n3)\mathcal O(n^3)做法

    直接枚举x,y,zx,y,z,判断是否符合上述式子

    这样显然超时

    O(n2)\mathcal O(n^2)做法

    可以枚举x,yx,y,然后判断对应的zz是不是平方数(平方根是不是整数)

    稍微快一点,

    O(n2logn)\mathcal O(\dfrac {n^2} {\log n}) 做法

    $$x^2+y^2=z^2 \\ x^2=z^2-y^2 \\ x^2=(z+y)(z-y)\\ \because z>0,y>0 \\ \therefore z+y>z-y $$

    考虑对x2x^2分解成x2=abx^2=ab,其中a>x>b>0a>x>b>0且为正整数 得二元一次方程组

    {z+y=azy=b\begin{cases} z+y=a\\ z-y=b \end{cases}

    解得

    $$\begin{cases} z=\frac{a+b}2\\ y=\frac{a-b}2 \end{cases} $$

    所以有一个要求

    ab(mod  2)a \equiv b (mod\; 2)

    才能使z,yz,y为整数

    对于每一个xx,求出a,ba,b,判断以上注意事项即可

    如何分解

    如果直接分解x2x^2,需要枚举11~xx,复杂度太高了,我们需要简单的O(x)O(\sqrt{x})做法

    可以分解xx,在推广到x2x^2

    memset(cnt,0,sizeof(cnt));
    		long long k=x;
    		for(int j=2;j<=k;j++)
    		{
    			if(k%j==0)
    			{
    				cnt[0][0]++;
    				cnt[cnt[0][0]][0]=j;
    				while(k%j==0) 
    				{
    					cnt[cnt[0][0]][1]++;
    					k/=j;
    				}
    				cnt[cnt[0][0]][1]*=2; //to be x^2
    			}
    		}
    

    时间复杂度为 O(n2logn)\mathcal O(\dfrac {n^2} {\log n})

    • @ 2023-10-17 10:34:06

      之前分析的不对,改了改,顺便,这题最快的是打表做法,打勾股数的表

  • 1

[DuckOI&DiyinOI]直角三角型的数量||简单三角形计数题

信息

ID
6
时间
1000ms
内存
256MiB
难度
9
标签
(无)
递交数
10
已通过
4
上传者