毕达哥拉斯三元组x^2 + y^2 = z^2
本原毕达哥拉斯三元组 gcd(x,y,z)==1
满足 x = m^2 – n^2,y = 2*m*n,z = m^2 + n^2,其中m>n
只需枚举m、n,然后将三元组x、y、z乘以i(保证i*z在所给范围内,因为z>x且z>y)。
#include<iostream> #include<cstdio> #include<string> #include<string.h> #include<algorithm> #include<cstdlib> #include<ctime> #include<cmath> #include<iomanip> #include<map> #include<vector> #include<queue> #include<stack> #include<bitset> //#include<bits/stdc++.h> using namespace std; typedef long long LL; #define gamma 0.57721566490153286060651209008240243104215933593992 const double Pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int MAXN=2000050; bitset<MAXN>s; int main() { int n; while(cin>>n) { int ans=0; int cnt=0; s.reset(); for(int i=1; i*i<=n; ++i) { for(int j=i+1; j*j<=n; ++j) { if(i*i+j*j>n) continue; if(i%2==j%2) continue; if(__gcd(i,j)==1) { int x=j*j-i*i; int y=2*i*j; int z=i*i+j*j; ans++; for(int k=1; k*z<=n; ++k) { s.set(k*x); s.set(k*y); s.set(k*z); } } } } for(int i=1; i<=n; ++i) { if(!s[i]) cnt++; } cout<<ans<<" "<<cnt<<endl; } return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/108 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!