【xsy1116】数学题 奥数题

真实奥数题

题目大意:给你正整数k$,r$。问你存在多少对$(x,y)$,满足$x<y$且$x^2+y^2=kz^2$,并将所有符合条件的数对输出。

数据范围:$r≤1e9$,$k={1,2,3}$。

我们先考虑$k=1$的情况,显然就是一个求勾股数对数的问。有一种经典的枚举所有$x^2+y^2=z^2$且$(x,y,z)=1$的勾股数对数的式子:

$\begin{cases} x=2nm\\ y=n^2-m^2 \\ z=n^2+m^2 \end{cases}$

证明的话,展开下式子算算就好

我们只需要暴力枚举r的因数进行计算就可以了,时间复杂度$O(r^{\frac{1.066}{\ln\ln\ n}+0.5})$(这个式子是抄来的,证明本蒟蒻不懂,反正是能过的qwq)。

考虑$k=2$的情况,我们参考处理$k=1$的情况,列一组式子,可以枚举所有$x^2+y^2=2z^2$且$(x,y,z)=1$的式子:

$\begin{cases} x=n-m\\ y=n+m \\ z=\sqrt{n^2+m^2} \end{cases}$

证明同上

我们不难发现,这时候求解的关键变为了求$z^2=n^2+m^2$的对数(并将所有方案打出),这不就是第一问吗$qwq$。

我们只需要求出所有的$(n,m)$数对后,简单转化一波就可以了。

考虑k=3的情况,抱歉这个是无解的qwq

 1 #include<bits/stdc++.h>
 2 #define L long long
 3 #define M 10000005
 4 using namespace std;
 5
 6 pair<L,L> p[M]; int cnt=0;
 7
 8 int solve(L z,L bei){
 9     int res=0;
10     for(L n=1;n*n<=z;n++){
11         L m=sqrt(z-n*n),x=0,y=0;
12         if(m*m+n*n!=z) continue;
13         x=2*n*m;
14         y=n*n-m*m;
15         if(x==y) continue;
16         if(x>y) swap(x,y);
17         if(x<=0) continue;
18         p[++cnt]=make_pair(x*bei,y*bei);
19         res++;
20     }
21     return res;
22 }
23
24 int main(){
25     int cas; cin>>cas;
26     while(cas--){
27         L k,z,ans=0; cin>>k>>z; cnt=0;
28         if(k==3) {printf("0\n"); continue;}
29         for(L i=1;i*i<=z;i++) if(z%i==0){
30             ans+=solve(i,z/i);
31             if(i*i!=z) ans+=solve(z/i,i);
32         }
33         sort(p+1,p+cnt+1);
34         cnt=unique(p+1,p+cnt+1)-p-1;
35         if(k==2){
36             for(int i=1;i<=cnt;i++){
37                 p[i]=make_pair(p[i].second-p[i].first,p[i].second+p[i].first);
38             }
39             sort(p+1,p+cnt+1);
40             cnt=unique(p+1,p+cnt+1)-p-1;
41         }
42         printf("%d\n",cnt);
43         for(int i=1;i<=cnt;i++) printf("%d %d\n",p[i].first,p[i].second);
44
45     }
46 }

原文地址:https://www.cnblogs.com/xiefengze1/p/10353864.html

时间: 2024-11-09 13:35:42

【xsy1116】数学题 奥数题的相关文章

? 题目 一道超难的奥数题,猜生日. A告诉B他生日的月份,告诉C他生日的日期 B说:“如果我不知道A的生日,那C肯定也不知道.&quot; C说:”本来我不知道,现在我知道了.“ B说:”哦,那我也知道了.

现在的学生真是太生猛了,一道奥数题突破天际了.... 闲话少说,看题: 一道超难的奥数题,猜生日.A告诉B他生日的月份,告诉C他生日的日期B说:"如果我不知道A的生日,那C肯定也不知道."C说:"本来我不知道,现在我知道了."B说:"哦,那我也知道了."A的生日可能是:11月4日 11月5日 11月8日 1月4日 1月22日 3月1日 3月5日 7月1日7月2日 7月8日请问A的生日是几月几日? 附上某网友解答过程: 11月4日 11月5日 11

从150盏灯这道奥数题说起......

前段时间,成都9岁学生纠错奥赛名题这篇文章在网上爆红.本文不关注神童之类的新闻,仅仅从计算机实现的角度来验证题目正确性. 题目描述(需求描述): 150盏亮着的电灯,各有一个拉线开关控制,按顺序编号为1,2,3,-,150.将编号为3的倍数的灯的拉线各拉一下,再将编号为5的倍数的灯的拉线各拉一下,拉完后亮着的灯数为__盏. 使用暴力穷举法来获得正确答案: 为了简单期间,我们可以将150盏灯缩小10倍,变为15盏灯,这样就很容易用暴力穷举法来标记出灯的最终结果: 答案: 第一遍拉灭3的倍数,15÷

新加坡小学奥数题:谢丽尔的生日

 阿尔贝茨和贝尔纳德想知道谢丽尔的生日,于是谢丽尔给了他们俩十个可能的日期:5月15日.5月16日.5月19日.6月17日.6月18日.7月14日.7月16日.8月14日.8月15日.8月17日.谢丽尔只告诉了阿尔贝茨她生日的月份,告诉贝尔纳德她生日的日子.阿尔贝茨说:我不知道谢丽尔的生日,但我知道贝尔纳德也不会知道.贝尔纳德回答:一开始我不知道谢丽尔的生日,但是现在我知道了.阿尔贝茨也回答:那我也知道了.那么,谢丽尔的生日是哪月哪日? 很简单的一道题,不知道为什么会火起来.求解也很简单,首

支付宝扫码答奥数 5分钟做出来可免单

6月22日消息,支付宝是个很会玩的应用,支付宝扫码支付已经成为大家的日常, 但扫二维码出现小学奥数题,答对吃饭免单还是头一次.这样的新玩法你见过吗? 会玩!支付宝扫码答奥数 5分钟做出来可免单 据了解,在四川农业大学成都校区,有一家叫做"不挂科"的餐厅.昨天,这家餐厅推出了支付宝扫码抽奖游戏.来店里吃饭的顾客, 只要用支付宝扫描桌上的口碑码,就有可能扫出一道小学奥数题.如果能够在5分钟内答对这道题,老板就会免掉顾客的这顿饭钱. "不挂科"的老板左腾和谢龙云说, 餐厅

数学家吴文俊批判 中国式奥数 害人害数学

奥数震动了两位最高科技奖得主 一谈起“奥数”,国内当今数学界的泰斗级人物吴文俊院士就急了. 他在沙发上挺直了腰,瞪大眼睛,伸出手掌指指点点:“是害人的,害数学!” “什么奥林匹克?没这回事!” 这位获得过国家最高科技奖的老数学家摆摆手:“奥林匹克数学竞赛不值得讲——胡闹了,走上邪路了,非但起不到正面作用,反而起到反面作用.” 这是93岁的吴文俊少有的严肃的一面.在数学界他以“老顽童”著称.他已许久没有公开露面.对于“具体的知识”,他形容自己已经知之甚少. 接受采访时,他对中国青年报记者声称,自己

hdu 1012:u Calculate e(数学题,水题)

u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28686    Accepted Submission(s): 12762 Problem Description A simple mathematical formula for e iswhere n is allowed to go to infinit

吐槽小学奥数

前几天有幸到一家从事小学奥数培训的辅导班当老师,刚去当天辅导小学四年级奥数,看到两个题就吓尿了,尿完之后发现,原来这俩题我会呀. 题目一:210!最后结果有几个零. 如果你之前没有在编程之美等书上看到过这道题,如果你不是数学怪物,我想百分之80的人对这道题都会素手无策,好在我曾在编程之美看到过此题,因此很利索的搞定了. 结果末尾有多少个0的问题可以转换为N!乘式中可以分解出多少个5的问题.因为5和其前面的任何一个偶数相乘都会产生0,所以只需求出在由1到N的数中共可以分解出多少个5.例如25!,可

小学奥数学习方法

小学奥数学习方法 小学奥数,当以培养自学能力为主,以数图合一的方法为辅.在方程上进行拓展,为初中的数学学习打下扎实基础.具体见以下几方面. 一.选择奥数教材.选择第几册.奥数教材,当以考察梯度均衡为主.我们选择的是<小学奥数读本>.一般N年级的学生,选择N-1年级的奥数书.这只是一般的选择方法.具体以学生为主,通过浏览相近几册的难易度,来选择适合自己的.太难,效率反而不会高,还会使兴趣受挫.太易,也没有那个必要. 二.看例题方法.要想从例题中学习到更多,一个是要做例题.另一个是要学会总结归纳.

SDUT 2867 小学奥数(下)(规律)

小学奥数(下) Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 到了夏天了,ACM协会发福利了,发了很多西瓜,聪明的小明很爱思考,一个西瓜, n刀最多能切成几部分? 你能帮他解决么? 输入 多组输入,每组一行,直到文件结束.输入一个n(0≤n≤100). 输出 对于每一组输入,输出单个数字,n刀可以把西瓜切成几部分. 示例输入 1 2 3 示例输出 2 4 8 提示 来源 示例程序 #include<iostream> #i