首页 > 其他分享 >51nod 1165 整边直角三角形的数量 【数学:公式--求约数】

51nod 1165 整边直角三角形的数量 【数学:公式--求约数】

时间:2022-11-21 23:00:19浏览次数:49  
标签:约数 1165 整边 int yyy ++ kp lp yue



1165 整边直角三角形的数量

基准时间限制:2 秒 空间限制:131072 KB 分值: 160  难度:6级算法题

 收藏

 关注

直角三角形,三条边的长度都是整数。给出周长N,求符合条件的三角形数量。

例如:N = 120,共有3种不同的满足条件的直角3角行。分别是: {20,48,52}, {24,45,51}, {30,40,50}。

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)第2 - T + 1行:每行1个数N(12 <= N <= 10^7)。

Output

输出共T行,每行1个对应的数量。

Input示例

212013

Output示例

30



0.0

51nod  1165 整边直角三角形的数量 【数学:公式--求约数】_i++


知道b的范围后---求n^2的约数---判定就行啦------


代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
double sq;
struct node{
int ge,shu;
}yyy[12000];
int lp,kp,zp;
LL yue[60000],zhi[6000];
void yu(int n)
{
for (int i=0;i<zp&&zhi[i]<=n;i++)
{
if (n%zhi[i]==0)
{
yyy[lp].ge=0;
while (n%zhi[i]==0)
{
yyy[lp].ge+=2;
n/=zhi[i];
}
yyy[lp++].shu=zhi[i];
}
}
if (n!=1)
{
yyy[lp].ge=2;
yyy[lp++].shu=n;
}
}
void slove()
{
LL l,n,n2;
scanf("%lld",&n);
if (n%2)
{
printf("0\n");
return ;
}
lp=0,kp=0;
yu(n);//求约数
yue[kp++]=1;
for (int i=0;i<lp;i++)
{
int k=kp;
int kk=yyy[i].ge;
LL cheng=1;
while (kk--)
{
cheng*=yyy[i].shu;
for (int j=0;j<k;j++)
{
if (yue[j]*cheng>=2*n) continue;
yue[kp++]=yue[j]*cheng;
}
}
}
sort(yue,yue+kp);//n^2的<2n的约数--n
l=int(sq*n);n2=2*n;
int kai=upper_bound(yue,yue+kp,l)-yue;
LL ans=0,b,a,c;
for (int i=kai;i<kp;i++)
{
if (yue[i]==yue[i-1]||(yue[i]&1)||(n*n)%yue[i]!=0) continue;
b=n-(n*n/yue[i]);
a=n-yue[i]/2;
c=yue[i]/2-b;
if (a>0&&a<=b&&b<c)
{
ans++;
}
}
printf("%lld\n",ans);
}
void ss()
{
bool fafe[4000];zp=0;
memset(fafe,true,sizeof(fafe));
for (int i=2;i<4000;i++)
{
if (fafe[i])
{
zhi[zp++]=i;
for (int j=i*i;j<4000;j+=i)
fafe[j]=false;
}
}
}
int main()
{
ss();
sq=sqrt(2.0);
int t;scanf("%d",&t);
while (t--)
slove();
return 0;
}



标签:约数,1165,整边,int,yyy,++,kp,lp,yue
From: https://blog.51cto.com/u_15886902/5875436

相关文章

  • 求最大公约数
    #pragmawarning(disable:4996)#include<stdio.h>intmain(){intn=0;intm=0;intq=0;printf("请输入需要求最大公约数的两组数字:");scanf("%d%d",&n,&m......
  • 洛谷 P1403 约数研究
    洛谷P1403约数研究P1403约数研究-洛谷前置知识\(a\)能整除\(b\)用符号表示为\(b\mida\)\(1\simn\)中约数(即因子)含\(x\)的个数为\(\left\lfloor\df......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 最大公约数
    最大公约数欧几里得算法对于两个数\(a,b\),设\(a>b\),当\(a\%b==0\)时,答案为\(b\)。否则,设\(a=b*q+r,r<b\),则\(gcd(a,b)=gcd(b,a\%b)\),时间复杂度\(O(\logN)\)......
  • 220. 最大公约数
    题目链接220.最大公约数给定整数\(N\),求\(1\lex,y\leN\)且\(GCD(x,y)\)为素数的数对\((x,y)\)有多少对。\(GCD(x,y)\)即求\(x,y\)的最大公约数。输入格......
  • 区间最大公约数
    区间最大公约数给定一个长度为$N$的数列$A$,以及$M$条指令,每条指令可能是以下两种之一:Clrd ,表示把$A[l],A[l+1],\ldots,A[r]$都加上$d$。Qlr ,表示询问......
  • 最大公约数、最小公倍数的求解
    1#include<stdio.h>2intmain()3{4intr,m,n;5printf("请输入m,n(用逗号间隔):");6scanf("%d,%d",&m,&n);7r=m%n;8while(r!......
  • 最大公约数 C/C++ leetcode , 辗转相除,更相减损
    #include <iostream>using namespace std;// 辗转相除法求最大公约数,用大的模小的,然后用除数模余数,该接口在新版的C++17的numeric 包中也有int gcd1(int a ,......
  • 欧几里得(辗转相除法)求两个数最大公约数
    #include<stdio.h>intEA(inta,intb)//欧几里得算法{intremainder;intmiddle;if(a<b)//a,b交换值{b=a+b;a......
  • 最大公约数最小公倍数的探索(三种方法)
    本题要求两个给定正整数的最大公约数和最小公倍数。第一遍自己做时,根据原理暴力求解    结果可想而知超时了 看完翁恺老师的视频,学会第二种方法———辗转相......