HZOJ 方程的解
乍一看还以为是道水题,没想到这玩意这么难搞。
看题显然是exgcd,然而exgcd求的是一个解而不是解的个数(考试的时候不记得通解的式子然后挂了)。
对于40%的数据,直接枚举计数即可。
对于另为20%,a+b=c,puts("1");
这60分差不多是送的。
剩下的就是比较恶心的了:
先讨论都是正数的情况:$ax+by=c$,exgcd可以求$ax+by=gcd(a,b)$的解x0,y0,设t=c/gcd(a,b);则$a*tx_0+b*ty_0=t*gcd(a,b)=c$.
那么我们就求出了方程的一组特解,方程的通解为$x=x_0+kb,y=y_0-ka$,那么可以枚举k计数(加一些优化可以拿到这20分),但这样太慢。
能不能不用枚举呢?a/=gcd(a,b),b/=gca(a,b),c/=gcd(a,b)=t;因为$x=x_0+kb$,将x0模b(如果<=0,+b),得到x0的最小正数解(此时k最小),$ax+by=c$得$y_0=(c-a*x_0)/b$,
那么我们就的到了y0的最大解,y0%=a,那么我们得到了y0的最小正数解,则ans=(y0-miny)/a0+1。
那么对于负数呢?
只需要将a,b变为正数求解,之后将a,b与求得的x0,y0同乘-1,等式仍然成立。
#include<iostream>
#include<cstdio>
#define LL long long
#define int LL
using namespace std;
int T,a,b,c;
int gcd(int a,int b){return b==?a:gcd(b,a%b);}
int exgcd(int a,int b,int &x,int &y)
{
if(!b){x=,y=;return a;}
int gcd=exgcd(b,a%b,x,y),t=x;
x=y,y=t-a/b*y;
return gcd;
}
inline int read();
signed main()
{
// freopen("in.txt", "r", stdin);
// freopen("0.out", "w", stdout);
cin>>T;
while(T--)
{
cin>>a>>b>>c;
if(a==&&b==&&c==){puts("ZenMeZheMeDuo");continue;}
if(a==&&b==&&c!=){puts("");continue;}
if(a==&&c==){puts("ZenMeZheMeDuo");continue;}
if(a==&&c%b==&&c/b>){puts("ZenMeZheMeDuo");continue;}
if(a==){puts("");continue;}
if(b==&&c==){puts("ZenMeZheMeDuo");continue;}
if(b==&&c%a==&&c/a>){puts("ZenMeZheMeDuo");continue;}
if(b==){puts("");continue;}
if(a<&&b<&&c<){a=-a,b=-b,c=-c;}
if(a==&&b==)//
{
if(c>=){puts("ZenMeZheMeDuo");continue;}
else {printf("%lld\n",c-);continue;}
}
if(a+b==c){puts("");continue;}
if(a<=&&b<=&&c<=&&a>&&b>&&c>)//
{
int ans=;
for(int x=;x<=c;x++)
{
for(int y=;y<=c;y++)
{
if(a*x+b*y==c)ans++;
if(ans>=)break;
}
if(ans>=)break;
}
if(ans>=){puts("ZenMeZheMeDuo");continue;}
else {printf("%lld\n",ans);continue;}
}
else
{
int fa=,fb=;
if(c<)a=-a,b=-b,c=-c;
if(a<)a=-a,fa=;
if(b<)b=-b,fb=;
int GCD=gcd(a,b);
if(c%GCD!=){puts("");continue;}
int t=c/GCD,x0,y0;
exgcd(a,b,x0,y0);x0*=t;y0*=t;
int a0=a/GCD,b0=b/GCD;c=t;
if(fa)a0=-a0,x0=-x0;
if(fb)b0=-b0,y0=-y0;
if(a0<)a0=-a0,b0=-b0,c=-c;
if(a0*b0<){puts("ZenMeZheMeDuo");continue;}
x0=x0%b0;
if(x0<=)x0+=b0;
y0=(c-a0*x0)/b0;
if(y0<){puts("");continue;}
LL miny=y0%a0;
if(miny==)miny+=a0;//
if(miny>y0){puts("");continue;}
else
{
int ans=(y0-miny)/a0+;
if(ans>=){puts("ZenMeZheMeDuo");continue;}
else {printf("%lld\n",ans);continue;}
}
}
}
}
inline int read()
{
int s=,f=;char a=getchar();
while(a<''||a>''){if(a=='-')f=-;a=getchar();}
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s*f;
}
HZOJ 方程的解的更多相关文章
- vijosP1371 方程的解
vijosP1371 方程的解 链接:https://vijos.org/p/1371 [思路] 组合公式+快速幂+高精单精. 求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx ...
- 方程的解_NOI导刊2010提高
方程的解 给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1. 解 显然x是可以快速幂得到答案的,而该问 ...
- P1771 方程的解_NOI导刊2010提高(01)
P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...
- 【Java例题】4.4使用牛顿迭代法求方程的解
4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...
- 模拟7题解 T1方程的解
方程的解 [扩展欧几里德] 首先进行特判,两个小时基本想到了,除了a!=0,b==0,a*c<0这种情况 其次就是一般情况: 首先exgcd求出ax+by=GCD(a,b)的一组任意解 然后两边 ...
- 洛谷P1771 方程的解
P1771 方程的解 都知道这个题可以用隔板法做 把这个\(g(x)\)想象为.....\(g(x)\)个苹果? 因为解是正整数,所以给这些"苹果"分组的时候每组最少有一个 然后我 ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...
- C++ 二分法求解方程的解
二分法是一种求解方程近似根的方法.对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我们之后给出了的两个初值决定的区间 [-20,20 ...
- [CSP-S模拟测试]:方程的解(小学奥数)
题目描述 给出一个二元一次方程$ax+by=c$,其中$x$.$y$是未知数,求它的正整数解的数量. 输入格式 第一行一个整数$T$,表示有$T$组数据.接下来$T$行,每行$3$个整数$a$.$b$ ...
随机推荐
- properties和 xml配置方式,如何选择
在学习集成log4j的时候,接触到了properties配置 个人感觉不是很好用,但与xml配置都可以完成指定的功能 properties配置文件,风格是一个属性对应于一个值(key = value) ...
- 独立版的 Asio安装与使用
Asio分为独立版和Boost版.两者使用方法基本一致,只是头文件不同.Boost版是作为Boost的子库提供的. 因为Asio的组织形式为hpp文件(不同一般的C++项目区分头文件.h和源文件.cp ...
- oracle基本认识
概要图 1. 环境搭建 1.1 Oracle的安装 数据库的三个常用的用户及默认密码sys:change_on_installsystem:managerscott:tiger Oracle客户端: ...
- ACdream 1007 (快速幂)
题目链接 a + b Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Problem D ...
- zoj 1028 Flip and Shift(数学)
Flip and Shift Time Limit: 2 Seconds Memory Limit: 65536 KB This puzzle consists of a random se ...
- IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+"
IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+" 2017-04-01 15:33 两天前,IDG资本合伙人过以宏提出的“VC+”,又有了新的内涵——全球 ...
- WPF快速入门系列(6)—— WPF资源和样式
一.引言 WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用.而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果 ...
- Ubuntu卸载通过apt-get命令安装的软件
卸载一个已安装的软件包(删除配置文件): apt-get --purge remove packagename
- Centos7.2源码编译安装LA(N)MP
LAMP环境中php是作为apache的模块安装的,所以安装顺序是php放在apache的后面安装,这样便于安装php时可以在apache的模块目录生成对应的php模块. apache版本:2.4.3 ...
- SQL优化系列(一)- 优化SQL
优化SQL SQL开发人员从源代码中发现一条跑得很慢的SQL, 如何优化? DBA从AWR报告中发现一条跑得很慢的SQL,没有源代码或者不想修改源代码怎么办? SQL自动优化工具SQL Tuning ...