zoukankan      html  css  js  c++  java
  • 【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$的勾股数对数的式子:

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

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

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

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

    $egin{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
    "); 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
    ",cnt);
    43         for(int i=1;i<=cnt;i++) printf("%d %d
    ",p[i].first,p[i].second);
    44 
    45     }
    46 }
  • 相关阅读:
    Azure SQL Database (1) 用户手册
    Windows Azure Web Site (17) Azure Web Site 固定公网IP地址
    MongoDB数据文件内部结构
    压缩 MongoDB 的数据文件
    服务器如何选择网络带宽(转)
    刀片服务器和磁盘阵列卡(RAID)技术---永和维护(转)
    Solr打分出错
    Solr添加SolrDocument报错
    解决Windows Git Bash中文乱码问题
    HAProxy的独门武器:ebtree
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/10353864.html
Copyright © 2011-2022 走看看