方程的解

Posted 2018hzoicyf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方程的解相关的知识,希望对你有一定的参考价值。

  总之这题如果静下心来仔细想,拿个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<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             elseputs("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                 elseputs("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                 elseputs("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\n",(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\n",ans);
94     
95     return 0;
96 
View Code

以上是关于方程的解的主要内容,如果未能解决你的问题,请参考以下文章

《Linear Algebra and Its Application》-线性方程组的解

matlab微分方程的解?

用c语言编程求线性方程组的解

求指教:Python怎样分别输出方程组的解?

用C语言编写程序实现一元二次方程的解?

Python编写“求一元二次方程的解”