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

看题显然是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. js 禁止复制粘贴

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...

  2. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  3. Leetcode501.Find Mode in Binary Search Tree二叉搜索树中的众数

    给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当 ...

  4. jquery中clientY,pageY和screenY的区别 最后三张图一目了然。

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...

  5. 引用CDN内容的方法总结

    1.1.1 摘要 CDN相信大家都听说过,甚至使用过相关的技术,也许有些人会回答“没有听说过和使用过该技术”,真的是这样吗? CDN的全称是Content Delivery Network,即内容分发 ...

  6. Maven常用命令备忘

    1. 修改版本号 mvn versions:set -DnewVersion=1.0.1-SNAPSHOT 2. <relativePath>的默认值是../pom.xml,如果没有配置, ...

  7. Codeforces Round #192 (Div. 2) A. Cakeminator【二维字符数组/吃掉cake,并且是一行或者一列下去,但是该行/列必须没有草莓的存在】

    A. Cakeminator time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. loadrunner分析之-网页、网络、资源分析

    在Web Page Diagnostics(网页分析)中当在场景中打开Diagnostics菜单下的Web Page Diagnostics功能,就能得到网页分析组图.通过这个图,可以对事务的组成进行 ...

  9. StringUtils常用方式留存

    StringUtils是org.apache.commons.lang下的一个工具包.主要用途从名字可以看出是针对于String的一些操作工具,里面包含的方法非常多,英语水平尚可以的人可以前往它的官方 ...

  10. PHP加密解密方法

    加密解密方法 //字符串解密加密 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_l ...