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

    题目链接

    题意分析

    这道题就是要你推式子主要是俺也不懂什么高斯素数

    对于

    \[x^2+y^2=r^2 \]

    我们转化为

    \[y^2=r^2-x^2=(r+x)(r-x)=dx*dy\ \ \ (x⊥y) \]

    由于\(x⊥y\) 那么我们一定可以转化为如下形式

    \(x=s^2\ \ \ y=t^2\)

    \[y^2=d^2*s^2*t^2\ \ \ 即y=dst \]

    同时

    \[r=d\frac{s^2+t^2}{2}\ \ \ \ \ x=d\frac{s^2-t^2}{2} \]

    利用左式我们可以枚举约数\(2^r\)的约数\(s^2+t^2\) 然后枚举\(s\)确定\(x\)以及\(y\) 从而求出个数

    同时不要忘了这里求出的\(x,y\)都是非负数 而符合要求的\(x,y\)可正可负 所以还要*4

    CODE:

    #include<bits/stdc++.h>
    #define M 1007511 
    using namespace std;
    long long n;
    int ans;
    long long gcd(long long x,long long y)
    {return y ? gcd(y,x%y):x;}
    void solve(long long x,long long d)
    {
    	for(long long i=1;i*i<=(x>>1);++i)
    	{
    		long long y=sqrt((x-i*i));
    		if(i*i+y*y==x&&gcd(i,x)==1) 
    		{
    			long long le=(d*(y*y-i*i))/2;
    			long long ri=sqrt(n*n-le*le);
    			if(le*le+ri*ri==n*n)
    			{
    				++ans;
    //				printf("%lld %lld %lld\n",le,ri,n);
    			}
    		}
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	for(long long i=1;i*i<=(n<<1);++i)
    	{
    		if((n<<1)%i) continue;
    		long long cdy=i,wzy=(n<<1)/i;
    		solve(cdy,wzy);
    		if(cdy!=wzy) solve(wzy,cdy);
    	}
    	printf("%d\n",ans*4);
    	return 0;
    }
    
  • 相关阅读:
    ViewPager
    SpringBoot入门
    SpringMVC拦截器
    QML布局概述(Qt Quick Layouts Overview)
    Ubuntu16.04软件安装错误处理(以安装ssh-server为例)
    VirtualBox实用网络设置
    Ubuntu安装cmake 3.9
    QML学习笔记
    Qt一些方便易用的小技巧
    Qt 4.8.5 + MinGW32 + Qt creater 安装
  • 原文地址:https://www.cnblogs.com/tcswuzb/p/14372128.html
Copyright © 2011-2022 走看看