[CSP-S模拟测试]:方程的解(小学奥数)
题目描述
给出一个二元一次方程$ax+by=c$,其中$x$、$y$是未知数,求它的正整数解的数量。
输入格式
第一行一个整数$T$,表示有$T$组数据。
接下来$T$行,每行$3$个整数$a$、$b$、$c$。
输出格式
输出$T$行,每行一个数,表示方程解的数量。
如果正整数解的数量比$65535$还多,输出$“ZenMeZheMeDuo”$。
样例
样例输入:
3
-1 -1 -3
1 1 65536
1 1 65537
样例输出:
2
65535
ZenMeZheMeDuo
数据范围与提示
$20\%$的数据,$a=b=1$。
$40\%$的数据,$T \leqslant 100,1 \leqslant a,b,c \leqslant 1000$。
另$20\%$的数据,$a+b=c,1 \leqslant a,b,c \leqslant 1,000,000$。
另$20\%$的数据,$1 \leqslant a,b,c \leqslant 1,000,000$。
100%的数据,$T \leqslant 10,000,-1,000,000 \leqslant a,b,c \leqslant 1,000,000$。
题解
$20\%$算法:
对于$a=b=1$,那么解的个数为$\max(c-1,0)$,直接输出就好了。
$40\%$算法:
对于$1 \leqslant a,b,c \leqslant 1000$的数据,只需要暴力枚举$x$,$y$即可。
另$20\%$算法$1$:
对于$a+b=c$,直接输出$1$即可。
另$20\%$算法$2$:
考虑小学奥数知识,我们只需要暴力求出$x$或$y$的最小正整数解,然后每次加上$a$和$b$的$lcm$,看在$c$以内可以加多少次即可。
不过正解好像是扩展欧几里得,考场上的我并不会……
$100\%$算法:
其实是特判:
$1.$如果$a,b$异号,如果$c \mod gcd(a,b)=0$,那么会有无穷多的解,否则无解。
$2.$如果$a,b$同号但与$c$异号,那么无解。
$3.$如果$a$或$b$等于$0$,如果$c$可以整除$b$且$b$为正整数,那么会有无穷多解,否则无解。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int ans;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&a,&b,&c);
if(c<0)a=-a,b=-b,c=-c;//方便处理
if((long long)a*b<0LL)//a,b异号,注意开long long,否则会爆
{
if(c%__gcd(a,b))puts("0");
else puts("ZenMeZheMeDuo");
continue;
}
if(a<0&&b<0)//a,b同号但与c异号
{
puts("0");
continue;
}
if(!a)//为0的情况
{
if(c%b||c/b<0)puts("0");
else puts("ZenMeZheMeDuo");
continue;
}
if(!b)
{
if(c%a||c/a<0)puts("0");
else puts("ZenMeZheMeDuo");
continue;
}
if(a+b==c)
{
puts("1");
continue;
}
int biu=c;
int lcm=a*b/__gcd(a,b);
for(int i=a;i<=c;i+=a)
if(!((c-i)%b)){biu=i;break;}
if(biu==c){puts("0");continue;}//无解
ans=(c-biu)/lcm;
if((c-biu)%lcm)ans++;
if(ans>65535)puts("ZenMeZheMeDuo");//判断解的个数
else printf("%d\n",ans);
}
return 0;
}
rp++
最新文章
- jQuery/javascript实现网页注册的表单验证
- CentOS安装Chrome
- Windows操作系统的历史
- [原创]leet code - path sum
- (原)windows8.1上使用opencv for python
- quartz 定时调度持久化数据库配置文件
- JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?!
- mysql慢查询问题
- html5 离线存储 地理信息与本地存储
- 运行Myeclipse时,如何删除IVM窗口
- java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;
- lvs负载均衡概述
- 简单配置jena在eclipse的开发环境
- C memset
- cad 关键字被保留了?选择集关键字保留了? N S W E关键字无法用?
- Code First 数据迁移 转
- gtk-gnash大量占用cpu解决办法
- [javaSE] 集合框架(迭代器)
- 【深入理解JAVA虚拟机】读后感
- Mysql:存储过程游标不进循环的原因详解