1 条题解

  • 0
    @ 2025-5-6 20:41:02

    此代码用于计算给定范围 n 内满足特定条件的勾股数三元组数量及未被覆盖整数数量,思路如下:

    1. 利用 gcd 函数计算最大公约数。
    2. 双重循环遍历 ij 找出勾股数 (x, y, z),要求 ij 奇偶性不同且互质,同时 i*i + j*j <= n
    3. 找到勾股数后,标记其倍数在 flag 数组中已使用。
    4. 统计勾股数数量 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
    上传者