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$ ...
随机推荐
- gomod
package main import "mycore" func main(){ mycore.ShowName() } main.go module mytest requir ...
- Birt设置导出格式和去掉多余按钮的方法
1.设置导出格式: webcontent>birt>pages>dialog>ExportReportDialogFragment.jsp页面: 找到for ( int i = ...
- 2018-2-13-wpf-如何使用-Magick.NET-播放-gif-图片
title author date CreateTime categories wpf 如何使用 Magick.NET 播放 gif 图片 lindexi 2018-2-13 17:23:3 +080 ...
- Header解析
不管是作为后端还是前端开发人员,对于web请求的过程和参数都是需要了解的. 下面是对一次简单的http请求的header分析,作为自己的一个总结,也希望对大家有所帮助. 以Chrome为例: 我们对h ...
- 访问Bing地图
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- go struct 工厂
- bnd -buildpath指令的用法
-buildpath的作用是为项目添加运行时依赖.这个依赖可以是workspace中的另一个项目或者是仓库中的另一个bundle. -buildpath指令只会在编译和构建时起作用,它从来不会被用来运 ...
- 【JZOJ4799】【NOIP2016提高A组模拟9.24】我的快乐时代
题目描述 输入 一行,两个整数l,r . 输出 一行,一个整数,表示第l 天到第r 天的愉悦值的和. 样例输入 64 89 样例输出 1818 数据范围 解法 可以参考数位动态规划的想法. 从个位开始 ...
- 一键制作启动elasticsearch和kibana启动的脚本可执行程序
1.测试环境 测试环境: . windows10专业版 . elasticsearch6.5.4 . kibana6.5.4 2.启动的脚本run.py import os import time i ...
- mysql自定义function 写递归查询子节点
#存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...