方程的解

  总之这题如果静下心来仔细想,拿个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             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\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 }

原文地址:https://www.cnblogs.com/2018hzoicyf/p/11227857.html

时间: 2024-10-18 17:41:41

方程的解的相关文章

用c语言求ax^2+bx+c=0方程的解

用c语言求ax^2+bx+c=0方程的解.#include <stdio.h>#include <math.h>#define m 0.000001int main(){     float a,b,c,x,x2,n,q,p;     scanf ("%f%f%f",&a,&b,&c);     n=b*b-4*a*c;     if ((a<m)&&(a>-m))     {         x=(-c)/b

codevs3732==洛谷 解方程P2312 解方程

P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .in. 输入共n + 2 行. 第一行包含2 个整数n .m ,每两个整数之间用一个空格隔开. 接下来的n+1 行每行包含一个整数,依次

9.10 第一题 方程的解 题解

这道题当时感觉是一道几乎纯考扩展欧几里得的题,然而板子忘了--于是乎这道题被我放在第二个打. 不得不说出题人相当良心,给了大把的暴力分前20分就是c-1,20~40暴力枚举,40~60输出1.白送的60分就到手了. 然而难得是后40分,我们可以先通过扩展欧几里得先求出x最小整数解,然后首先,自己本身就无解的方程输出0就好了,其次,如果a,b中有一个为零那么就是无限解如果都为0就看c,如果异号就是无限解等等等等特判,然后就没什么了,注意要开long long,细节真心坑,而且特判的顺序也极其重要.

欧几里德扩展方程 详解

作用: 欧几里德扩展方程是用来求解二元一次线性方程的.ax+by=c (a.b.c为已知数) 对于给定方程: ax+by=c,令g=gcd(a,b) 因为a是g的倍数,b也是g的倍数,所以令a=m*g , b=n*g,则: ax+by=g(m*x+n*y)=c 所得的结果c必然是g的倍数. 当且仅当mx+ny=1时,右边有最小值.而此时mn必定是互质的. 所以我们经常求的最小整数解就是求方程ax+by=gcd(a,b)的解. 解方程步骤: 对于方程 ax+by=gcd(a,b) 由欧几里德算法

方程有解习题

\(\fbox{例1}\)(2017?蚌埠模拟) 已知函数\(f(x)=lnx-x^3\)与\(g(x)=x^3-ax\)的图像上存在关于\(x\)轴的对称点,则\(a\)的取值范围为[ ] A.\((-\infty,e)\) \(\hspace{2cm}\) B.\((-\infty,e]\) \(\hspace{2cm}\) C. \((-\infty,-\cfrac{1}{e})\) \(\hspace{2cm}\) D. \((-\infty,-\cfrac{1}{e}]\) 分析:函数

C++ 二分法求解方程的解

二分法是一种求解方程近似根的方法.对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我们之后给出了的两个初值决定的区间 [-20,20][?20,20]),区间两端自变量 xx 的值对应的 f(x)f(x) 值是异号的,之后我们会计算出两端 xx 的中点位置 x'x′ 所对应的 f(x')f(x′) ,然后更新我们的迭代区间,确保对应的迭代区间的两端 xx 的值对应的 f(x)f(x) 值还会是异号的. 重复这个过程直到我们某一次

方程的解题解和扩欧的一些总结

题目描述 给出一个二元一次方程ax+by=c,其中x.y是未知数,求它的正整数解的数量. 输入输出格式 输入格式: 第一行一个整数T,表示有T组数据.接下来T行,每行3个整数a.b.c. 输出格式: 输出T行,每行一个数,表示方程解的数量.如果正整数解的数量比65535还多输出"ZenMeZheMeDuo". 题解 这个题一看就要先用扩展欧几里得求出一组x最小的整数解然后再计算出所有的解. 代码 1 #include<bits/stdc++.h> 2 using names

方程的解(exgcd模板)

题面在考试反思中. 题解: 这题其实只是个板子题,但考试时忘记了,又不会推导,于是凉凉... 借这道题回顾一下$ exgcd $的各种特判: 我习惯将方程$ ax+by=c $看成一次函数$ y=-\frac{a}{b}x+\frac{c}{b} $ 而在此之前我们要特判b是否为0,再根据一次函数的性质来判断. $ a,b,c $都为0时,无数组解. $ a,b $为0且$ c $不为0时,无解 $ b=0 $时,若$ a*c<0 $,无正整数解. 若$ c\%a=0 $,无数组解. $b$不为

7-54 求方程的解 (10 分)

求ax2+bx+c=0方程的实根.a,b,c由键盘输入. 解方程要考虑系数a等于零的情况.a等于零有两种情况(b==0,b!=0),a不等于零有三种情况(delta>0.==0.<0),先计算得到根x1.x2,再输出 输入格式: 输入三个数a,b,c. 输出格式: 输出方程的实根(保留两位小数),如果方程有1个实根,则输出根:如果方程有2个不等实根,则一起输出(使用空格分开),先输出较大根,后输出较小根. 其余情况(如无实根等)则输出No. 输入样例: 1 -3 2 输出样例: 2.00 1.

BZOJ 3129 [Sdoi2013]方程 不定方程解的个数+组合数取模

题意:链接 方法:不定方程解的个数+组合数取模 解析: 先看n1与n2的部分的限制. 对于后半部分的限制来说,我们直接减去An1+i?1就可以转化一下求正整数解. 但是前半部分呢? 跟上一道猴子那个很像. 所以我们容斥搞就行了. 但是这道题好像不好写的地方不在这? 这题TMD不就是礼物吗! 大组合数取模如何取? 请参见我<BZOJ 礼物>的题解. 另外吐槽题干 明明是X1+X2+-+Xn=m 并不是小于等于 代码: #include <cstdio> #include <cs