乍一看还以为是道水题,没想到这玩意这么难搞。

看题显然是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 方程的解的更多相关文章

  1. vijosP1371 方程的解

    vijosP1371 方程的解 链接:https://vijos.org/p/1371 [思路] 组合公式+快速幂+高精单精. 求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx ...

  2. 方程的解_NOI导刊2010提高

    方程的解 给定x,求\(a_1+a_2+...+a_k=x^x\ mod\ 1000\)的正整数解解的组数,对于100%的数据,k≤100,x≤2^31-1. 解 显然x是可以快速幂得到答案的,而该问 ...

  3. P1771 方程的解_NOI导刊2010提高(01)

    P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...

  4. 【Java例题】4.4使用牛顿迭代法求方程的解

    4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...

  5. 模拟7题解 T1方程的解

    方程的解 [扩展欧几里德] 首先进行特判,两个小时基本想到了,除了a!=0,b==0,a*c<0这种情况 其次就是一般情况: 首先exgcd求出ax+by=GCD(a,b)的一组任意解 然后两边 ...

  6. 洛谷P1771 方程的解

    P1771 方程的解 都知道这个题可以用隔板法做 把这个\(g(x)\)想象为.....\(g(x)\)个苹果? 因为解是正整数,所以给这些"苹果"分组的时候每组最少有一个 然后我 ...

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

    P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 已知多项式方程: a ...

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

    二分法是一种求解方程近似根的方法.对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我们之后给出了的两个初值决定的区间 [-20,20 ...

  9. [CSP-S模拟测试]:方程的解(小学奥数)

    题目描述 给出一个二元一次方程$ax+by=c$,其中$x$.$y$是未知数,求它的正整数解的数量. 输入格式 第一行一个整数$T$,表示有$T$组数据.接下来$T$行,每行$3$个整数$a$.$b$ ...

随机推荐

  1. gitlab上fork别人的代码后更新的2种解决方式

    1.解决方式1 首先要先确定一下是否建立了主repo的远程源: git remote -v如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...

  2. python基础--线程、进程

    并发编程: 操作系统:(基于单核研究) 多道技术: 1.空间上的复用 多个程序共用一个计算机 2.时间上的复用 切换+保存状态 例如:洗衣 烧水 做饭 切换: 1.程序遇到IO操作系统会立刻剥夺着CP ...

  3. 小飞音箱wifi配网流程

    音箱出货时,已经内置wifi,如果无法接通,按照如下方案执行: 小飞音箱wifi配网流程 0. 接通音箱电源 通电3分钟后,音箱如果显示红色光圈,表示未联网,则需要手动联网 1. 手机下载小飞在线ap ...

  4. pycharm中引入相对路径错误

    真是气死老子了,明明代码就在眼前,居然pycharm说找不到,import报错,最后才发现,需要设置代码的根目录,因此,python代码就在app目录下面,故将app设置成代码根目录就行了

  5. vue自定义全局公共函数

    单独零散的函数 在main.js里进行全局注册 Vue.prototype.ajax = function (){} 在所有组件里可调用 this.ajax() 多个函数定义在一个对象里 // xx. ...

  6. python ndarray相关操作:拼接

  7. font-weight

    font-weight 属性设置文本的粗细. 该属性用于设置显示元素的文本中所用的字体加粗.数字值 400 相当于 关键字 normal,700 等价于 bold. 每个数字值对应的字体加粗必须至少与 ...

  8. jmeter使用Badboy录制、检查点和参数化

    jmeter使用Badboy录制 1.打开Badboy,在地址栏输入需要录制的网址,如:百度首页

  9. ESP8266 支持浮点运算吗?

    ESP8266 支持浮点运算吗? 可以说支持,也可以说不支持. 说不支持的原因是因为 ESP8266 内部没有 FPU,无法使用硬件计算. 说支持的意思是可以使用软件进行浮点运算,但是会很慢很慢,如果 ...

  10. 连接池dbcp

    连接池dbcp DBCP:apache组织 使用步骤: 1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar.commons-logging-1.2 ...