当前位置: 首页 > news >正文

uva 106 Fermat vs. Pythagoras

数论经典问题:构造本原勾股数组(PPT):a^2+b^2=c^2 , 其中a,b,c两两互质

题意:给你一个n,让你找出一些勾股数组,a^2+b^2=c^2 , 需要满足a<b<c<=n 。 对于每个case题目首先需要你输出这些勾股数组中PPT的个数,然后再输出一个数字,这个数字是n-所有勾股数组用掉的数字个数

例如:

10

3,4,5  是唯一一组PPT解,所以第一个输出的数字是1

而另外的勾股数组包括 6 8 10 。 那么一共用掉的数字有3,4,5,6,7,8,那么没有用到的数字有4个,所以第二个数字输出4

————————————————————————————————

题意说完了就说怎么解:这个是一个很经典的初等数论问题,在数论概论中第一个问题就是这个问题

勾股数组的个数是无限个,一般的勾股数组并没有太大的研究价值,但是本原勾股数组(PPT)则有,PPT满足a,b,c两两互质,其他的勾股数组都是通过PPT不断翻倍得到的,所以研究本原勾股数组的本质和性质很重要

 

看了那一章然后自己在哦纸上写了一次证明,基本上算是搞懂了,但是不想再在电脑上打一遍,就简单说一下证明的过程

 

1.证明a和b必定一奇一偶,并可以推导出c一定是奇数 。 证明后我们约定a是奇数,b是偶数,c为奇数,但a和b的大小不能确定

2.a^2+b^2=c^2  --->  a^2=c^2-b^2=(c+b)*(c-b)  ,  那么可知(c+b)和(c-b)都是奇数

  然后证明 (c+b)与(c-b)互质,并且两者都是平方数

3.因为(c+b)与(c-b)都是平方数,则

(c+b)=s^2   ;     (c-b)=t^2  ;    ,满足s>t>=1

很容易证明s与t都是奇数,并且两者互质

4.用s和t来表示a,b,c

a=s*t

b=(s*s-t*t)/2

c=(s*s+t*t)/2

有最后得到的这3条式子,我们知道了构建PPT的方法,就是不断枚举两个奇数s和t,只要s和t互质,就可以通过这3条式子得到a,b,c,它们就是一组PPT。得到一组PPT后就不断翻倍得到其他的勾股数组

 

最后回到题目,要满足a<b<c<=n , 所以枚举s和t的时候可以缩小范围,否则会超时,具体实现看代码,注释写得很详细了

 

#include <cstdio>
#include <cmath>
#include <cstring>
#define N 1000010
bool used[N];

long long gcd(long long a , long long b)
{ return b==0 ? a: gcd(b,a%b); }

int main()
{
    long long n,a,b,c;
    long long count1,count2;
    while(scanf("%lld",&n)!=EOF)
    {
        count1=count2=0;
        memset(used,0,sizeof(used));
        long long m=(long long)sqrt(n+0.5);
        for(long long t=1; t<=m; t+=2)  
            for(long long s=t+2; s*t<=n; s+=2)
                if(gcd(s,t)==1)  //s>t>=1且s与t互质
                {
                    a=s*t;          //奇数
                    b=(s*s-t*t)/2;  //偶数
                    c=(s*s+t*t)/2;  //奇数
                    if(c<=n)        //在n范围内的PPT
                    {
                        count1++;      
                        //printf("本原勾股数组:%lld %lld %lld\n",a,b,c);
                        if(!used[a]) { count2++; used[a]=1; }
                        if(!used[b]) { count2++; used[b]=1; }
                        if(!used[c]) { count2++; used[c]=1; }

                        for(int j=2; c*j<=n; j++)  //j是倍数
                        {
                            if(!used[a*j]) { count2++; used[a*j]=1; }
                            if(!used[b*j]) { count2++; used[b*j]=1; }
                            if(!used[c*j]) { count2++; used[c*j]=1; }
                        }
                    }
                }
            printf("%lld %lld\n",count1,n-count2);
    }
    return 0;
}

 

相关文章:

  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • 老说技术更迭快,可十年到底可以淘汰多少知识?
  • 统计登录人数
  • 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!...
  • 图片翻转动画效果
  • “Incorrect Architecture” when trying to install iPhone app onto my development device
  • 邮件营销整体解决方案
  • java 字符串操作大全2 split 详解
  • cocos2d在iOS5sdk编译时警告的解决方法
  • oracl 中两种临时表的创建
  • #162 (Div. 2)
  • oracle开启归档模式
  • 本报记者 何泉峰 摄
  • Centos6安装桌面小记
  • 黑马程序员--小结asp.net中get、post用法区别
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • es6(二):字符串的扩展
  • in typeof instanceof ===这些运算符有什么作用
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java精华积累:初学者都应该搞懂的问题
  • js学习笔记
  • KMP算法及优化
  • learning koa2.x
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python打包系统简单入门
  • Python语法速览与机器学习开发环境搭建
  • 编写符合Python风格的对象
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 如何使用 JavaScript 解析 URL
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • #QT(智能家居界面-界面切换)
  • $().each和$.each的区别
  • (0)Nginx 功能特性
  • (C#)获取字符编码的类
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (ros//EnvironmentVariables)ros环境变量
  • (二)学习JVM —— 垃圾回收机制
  • (转)Linux下编译安装log4cxx
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .bat批处理(六):替换字符串中匹配的子串
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 设置默认首页
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET构架之我见
  • .NET下的多线程编程—1-线程机制概述
  • @JSONField或@JsonProperty注解使用
  • @Transactional 竟也能解决分布式事务?
  • [] 与 [[]], -gt 与 > 的比较
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Android 数据通信] android cmwap接入点
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析