首页 > 其他分享 >HDU3939(毕达哥拉斯三元组的解)

HDU3939(毕达哥拉斯三元组的解)

时间:2023-05-31 17:34:49浏览次数:42  
标签:prime 毕达哥拉斯 HDU3939 int 三元组 num ans include check


对于方程:

HDU3939(毕达哥拉斯三元组的解)_i++

,满足条件:x,y,z两两互素的正整数解为:

 

HDU3939(毕达哥拉斯三元组的解)_#include_02

,其中m>n>0,gcd(m,n)=1,m,n一奇一偶。


典型题目:POJ1305,HDU3939

 

对于POJ1305很简单,下面重点来解析HDU3939题。


题目:Sticks and Right Triangle

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>

using namespace std;
typedef long long LL;

const int N=1000005;

int p[N],phi[N];
bool prime[N];
int check[35];
int k,num;
LL ans,L;

void isprime()
{
    k=0;
    int i,j;
    memset(prime,true,sizeof(prime));
    for(i=2;i<N;i++)
    {
        if(prime[i])
        {
            p[k++]=i;
            for(j=i+i;j<N;j+=i)
            {
                prime[j]=false;
            }
        }
    }
}

void Init_phi()
{
    int i,j;
    for(i=1;i<N;i++)  phi[i]=i;
    for(i=2;i<N;i+=2) phi[i]>>=1;
    for(i=3;i<N;i+=2)
    {
        if(phi[i]==i)
        {
            for(j=i;j<N;j+=i)
            {
                phi[j]=phi[j]-phi[j]/i;
            }
        }
    }
}

void prime_check(int n)
{
    num=0;
    if(prime[n])
    {
        check[num++]=n;
        return;
    }
    for(int i=0;i<k&&n>1;i++)
    {
        if(n%p[i]==0)
        {
            check[num++]=p[i];
            while(n%p[i]==0) n/=p[i];
            if(n>1&&prime[n])
            {
                check[num++]=n;
                return;
            }
        }
    }
}

void dfs(int k,int r,int s,int n)
{
    if(k==num)
    {
        if(r&1) ans-=n/s;
        else    ans+=n/s;
        return;
    }
    dfs(k+1,r,s,n);
    dfs(k+1,r+1,s*check[k],n);
}

int main()
{
    int T;
    isprime();
    Init_phi();
    cin>>T;
    while(T--)
    {
        ans=0;
        cin>>L;
        int m=(int)sqrt(1.0*L);
        for(int i=m;i>0;i--)
        {
            int p=(int)sqrt(L-(LL)i*i);
            if(i&1)
            {
                prime_check(i);
                if(i<=p) dfs(0,0,1,i>>1);
                else     dfs(0,0,1,p>>1);
            }
            else
            {
                if(i<=p) ans+=phi[i];
                else
                {
                    prime_check(i);
                    dfs(0,0,1,p);
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}




标签:prime,毕达哥拉斯,HDU3939,int,三元组,num,ans,include,check
From: https://blog.51cto.com/u_16146153/6388622

相关文章

  • 982. 按位与为零的三元组
    题目链接:982.按位与为零的三元组方法一:枚举(超时)解题思路直接枚举\(i,j,k\)分别取\([0,n-1]\),判断\((\)\(nums[i]\)&\(nums[j]\)&\(nums[k]\)\()\)\(==\)\(0\)。由于本题的数量级较大\(n=1000\),\(n^3=10^9\),会导致暴力枚举超时。注意:\(==\)的优先级大于\(&\),......
  • 算术三元组的数目
    给你一个下标从0开始、严格递增的整数数组nums和一个正整数diff。如果满足下述全部条件,则三元组(i,j,k)就是一个算术三元组:i<j<k,nums[j]-nums[i]==diff且nums[k]-nums[j]==diff返回不同算术三元组的数目。示例1:输入:nums=[0,1,4,6,7,10],......
  • 递增三元组
    此题考查暴力,二分此题未AC用了两种方法解题dfsbinarySearchdfspackagelanqiao;importjava.util.Scanner;publicclassN172{staticint[][]m;......
  • 递增三元组
    递增三元组[蓝桥杯2018省B]递增三元组题目描述给定三个整数数组\(A=[A_1,A_2,\cdots,A_N]\),\(B=[B_1,B_2,\cdots,B_N]\),\(C=[C_1,C_2,\cdots,C_N]\)。......
  • 982. 按位与为零的三元组 (Hard)
    问题描述982.按位与为零的三元组(Hard)给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:0......
  • 982. 安位与为 0 的三元组
    题目链接: 982.按位与为零的三元组-力扣(LeetCode)    按位与为零的三元组-按位与为零的三元组-力扣(LeetCode) ......
  • 力扣---982. 按位与为零的三元组
    给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:   0<=i<nums.length   0<=j<nu......
  • 982. 按位与为零的三元组(位运算)
    题目https://leetcode.cn/problems/triples-with-bitwise-and-equal-to-zero/description/?orderBy=most_votes思路参考灵神题解,非常易懂,总结一些方法状态压缩常用......
  • LEETCODE 982. 按位与为零的三元组
    这题暴力的话会超时,考虑用哈希表来存储前两位与的结果的数量然后在另一个循环中枚举第三位和哈希表每个下标相与,找到结果为0的,对应的哈希表值加入ans中classSolution{publ......
  • 2023.3.4Leecode982按位与为零的三元组
    题目的要求给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:0<=i<nums.length0<=j<num......