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$ ...
随机推荐
- Codeforces Round #573 (Div. 2)
A:Tokitsukaze and Enhancement 当时看错条件了..以为A>C>B>D.就胡写了判断条件. #include<bits/stdc++.h> us ...
- WPF 动画执行后属性无法修改
在做了一个类似QQ展开的动画时,设置了TopProperty,通过改变Window.Top属性来实现展开特效, 但是动画执行了之后,再去设置Window.Top的时候发现修改不了,代码调试后发现值设置 ...
- SpringBooot-基础<2>-POM.xml配置
SpringBooot-基础<2>-POM.xml配置 项目创建完成后,需要配置pom.xml文件. pom.xml里面的配置,按需进行添加,这里提供一份参考,后面做笔记会都用到. < ...
- 2019.8.13 NOIP模拟测试19 反思总结
最早写博客的一次∑ 听说等会儿还要考试[真就两天三考啊],教练催我们写博客… 大约是出题最友好的一次[虽然我还是炸了],并且数据也非常水…忽视第三题的锅的话的确可以这么说.但是T3数据出锅就是你的错了 ...
- VI/VIM编辑器快捷键
常用快捷键: Ctrl+f 向下翻页 Ctrl+b 向上翻页 G 移动到文件最后一行 gg 移动到文件第一行 N+回车 ...
- linux性能监视工具sar
sar是一个优秀的一般性能监视工具,它可以输出Linux所完成的几乎所有工作的数据.sar命令在sysetat rpm中提供.示例中使用sysstat版本5.0.5,这是稳定的最新版本之一.关于版本和 ...
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- Liferay 7.1发布啦
下载地址: https://cdn.lfrs.sl/releases.liferay.com/portal/7.1.0-m1/liferay-ce-portal-tomcat-7.1-m1-20180 ...
- 转: CentOS上安装LAMP之第二步:PHP环境及安装过程报错解决方案(纯净系统环境)
最近有空就配置CentOS系统上的AMP环境,现在配置到PHP环境了 多话不说上传送门:http://blog.csdn.net/zhangatle/article/details/77447653 ...
- Direct2D 第4篇 渐变画刷
原文:Direct2D 第4篇 渐变画刷 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ...