zoukankan      html  css  js  c++  java
  • 方程的解

      总之这题如果静下心来仔细想,拿个80分并不难

      问题:扩欧只会板子,并未理解,扩欧解出来的是一组解而已,并没有最值等的特殊性。

      ax+by=c必须在c能整除gcd(a,b)的情况下,此时会有n多组解,设d=gcd(a,b);x=(c/d)*x0+k*(b/d),y=(c/d)*x0-k*(a/d);

      这题还是值得好好看看,因为特判情况可以搞到许多分。包括数据范围的特判,解的个数的特判。

      先纪念一下能把所有特殊数据跑粗来的对拍生成数据:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int random(int x){
     4     return (long long)rand()*rand()%x;
     5 }
     6 int zo(){
     7     int hh=random(100);
     8     if(hh>50)return -1;
     9     return 1;
    10 }
    11 int T,a,b,c;
    12 int main(){
    13     freopen("da.in","w",stdout);
    14     srand(time(0));
    15     T=random(100000)+1;
    16 //    cout<<zo()<<endl;
    17     cout<<T<<endl;
    18     while(T){
    19         --T;
    20         int he=random(8);
    21         a=zo()*random(1000001);b=zo()*random(1000001);c=zo()*random(1000001);
    22         switch(he){
    23             case 0:{
    24                 break;
    25             }
    26             case 1:{
    27                 a=0;
    28                 break;
    29             }
    30             case 2:{
    31                 b=0;
    32                 break;
    33             }
    34             case 3:{
    35                 c=0;
    36                 break;
    37             }
    38             case 4:{
    39                 a=b=0;
    40                 break;
    41             }
    42             case 5:{
    43                 a=c=0;
    44                 break;
    45             }
    46             case 6:{
    47                 b=c=0;
    48                 break;
    49             }
    50             case 7:{
    51                 a=b=c=0;
    52                 break;
    53             }
    54         }
    55         cout<<a<<" "<<b<<" "<<c<<endl;
    56     }
    57 }
    View Code

    AC代码: 

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<cmath>
     5 #define xian 65535
     6 #define ll long long
     7 using namespace std;
     8 inline ll read(){
     9     ll s=0,w=1;char ch=getchar();
    10     while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    11     while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
    12     return s*w;
    13 }
    14 
    15 ll T;
    16 ll a,b,c;
    17 ll ltmp;
    18 ll exgcd(ll a,ll b,ll &x,ll &y){
    19     if(!b){
    20         x=1;y=0;
    21         return a;
    22     }
    23     ll lgcd=exgcd(b,a%b,x,y);
    24     ltmp=x;
    25     x=y;
    26     y=ltmp-a/b*y;
    27     return lgcd;
    28 }
    29 
    30 int main(){
    31 //    freopen("da.in","r",stdin);
    32 //    freopen("te.out","w",stdout);
    33     T=read();
    34     while(T){
    35         --T;
    36         a=read();b=read();c=read();
    37         //cout<<c<<endl;
    38 
    39         if(a==0&&b==0){
    40             if(!c){puts("ZenMeZheMeDuo");continue; }
    41             else{puts("0");continue; }
    42         }
    43         if(!a){
    44             if(c*b<0){puts("0");continue; }
    45             else{
    46                 if(!c){puts("0");continue; }
    47                 if(c%b){puts("0");continue; }
    48                 else{puts("ZenMeZheMeDuo");continue; }
    49             }
    50         }
    51         if(!b){
    52             if(c*a<0){puts("0");continue; }
    53             else{
    54                 if(!c){puts("0");continue; }
    55                 if(c%a){puts("0");continue; }
    56                 else{puts("ZenMeZheMeDuo");continue; }
    57             }
    58         }
    59 
    60         if(a+b==c){puts("1");continue; }
    61         if(a<0)a*=-1,b*=-1,c*=-1;
    62         if(b>0&&c<0){puts("0");continue; }
    63         if(b>0&&c>0){
    64             if(a==1&&b==1){
    65                 if(c-1>xian)puts("ZenMeZheMeDuo");
    66                 else printf("%lld
    ",(c-1));
    67                 continue;
    68             }
    69         }
    70 
    71         ll x,y;
    72         ll lin=exgcd(a,b,x,y);
    73 
    74         if(c%lin){puts("0");continue; }
    75         if(a*b<0){puts("ZenMeZheMeDuo");continue; }
    76 
    77         ll xi=c/lin;
    78         x*=xi;y*=xi;
    79 
    80         if(x==0&&y==0){puts("0");continue; }
    81         if(x<0&&y<0){puts("0");continue; }
    82 
    83         ll jx=b/lin,jy=a/lin;
    84         ll ans=0;
    85 
    86         if(x<=0)ans=ceil(y*1.0/jy)-1-(-1*x/jx);
    87         else if(y>=0)ans=ceil(x*1.0/jx)-1-(-1*y/jy);
    88         else ans=ceil(x*1.0/jx)-1+ceil(1.0*y/jy);
    89 
    90         if(ans<=0){puts("0");continue; }
    91         if(ans>xian){puts("ZenMeZheMeDuo");continue; }
    92 
    93         printf("%lld
    ",ans);
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    线程池-java高并发编程详解第八章记录
    类加载过程-《java高并发编程详解》第九章 重点记录
    Actuator Elasticsearch healthcheck error
    【译】优雅的停止docker容器
    spring cloud之Eureka不能注销docker部署的实例
    spring cloud之Eureka
    spring cloud之docker微服务客户端注册eureka问题
    spring cloud consul上下线体验
    [Kerberos] Kerberos教程(二)
    [Kerberos] Kerberos教程(一)
  • 原文地址:https://www.cnblogs.com/2018hzoicyf/p/11227857.html
Copyright © 2011-2022 走看看