1 条题解
-
0
此代码用于计算给定范围
n
内满足特定条件的勾股数三元组数量及未被覆盖整数数量,思路如下:- 利用
gcd
函数计算最大公约数。 - 双重循环遍历
i
和j
找出勾股数(x, y, z)
,要求i
、j
奇偶性不同且互质,同时i*i + j*j <= n
。 - 找到勾股数后,标记其倍数在
flag
数组中已使用。 - 统计勾股数数量
m
和未被标记的整数数量n - k
并输出。
#include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #include <string> #include <utility> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; bool flag[1000000]; int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); } int main(){ int n; while(scanf("%d",&n)!=EOF){ memset(flag,false,sizeof(flag)); int m=0; int x,y,z; for(int i=1;i*i<=n;i++){ for(int j=i+1;j*j<=n;j++){ if(i*i+j*j>n)break; if((i&1)!=(j&1)){ if(gcd(i,j)==1){ x=j*j-i*i; y=2*i*j; z=i*i+j*j; m++; for(int k=1;;k++){ if(k*z>n)break; flag[k*x]=flag[k*y]=flag[k*z]=true; } } } } // cout<<i<<" "; } int k=0; for(int i=1;i<=n;i++) if(flag[i])k++;//set太慢 printf("%d %d\n",m,n-k); } return 0; }
- 利用
- 1
信息
- ID
- 306
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者