【xsy1116】数学题 奥数题
真实奥数题
题目大意:给你正整数k,r。问你存在多少对(x,y),满足x<y且x2+y2=kz2,并将所有符合条件的数对输出。
数据范围:r≤1e9,k=1,2,3。
我们先考虑k=1的情况,显然就是一个求勾股数对数的问。有一种经典的枚举所有x2+y2=z2且(x,y,z)=1的勾股数对数的式子:
{x=2nmy=n2−m2z=n2+m2
证明的话,展开下式子算算就好
我们只需要暴力枚举r的因数进行计算就可以了,时间复杂度O(r1.066lnln n+0.5)(这个式子是抄来的,证明本蒟蒻不懂,反正是能过的qwq)。
考虑k=2的情况,我们参考处理k=1的情况,列一组式子,可以枚举所有x2+y2=2z2且(x,y,z)=1的式子:
{x=n−my=n+mz=√n2+m2
证明同上
我们不难发现,这时候求解的关键变为了求z2=n2+m2的对数(并将所有方案打出),这不就是第一问吗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 }
分类:
模拟
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!