Description

You are given two integers N,C and two integer sequences a and b of length N. The sequences are indexed from 1 to N.

Please solve the following equation for x:

where |v| means the absolute value of v.

Input

The first line contains an integer T indicating there are T tests. Each test consists of N+1 lines. The first line contains two integers N,C. The i-th line of following N lines consists of two integers ai,bi.

  • 1≤T≤50

  • 1≤N≤10^5

  • 1≤ai≤1000

  • −1000≤bi≤1000

  • 1≤C≤10^9

  • only 5 tests with N larger than 1000

Output

For each test, output one line.

If there are an infinite number of solutions, this line consists only one integer −1.

Otherwise, this line first comes with an integer m indicating the number of solutions, then you must print m fractions from the smallest to the largest indicating all possible answers. (It can be proved that all solutions can be written as fractions). The fraction should be in the form of "a/b" where a must be an integer, b must be a positive integer, and gcd(abs(a),b)=1. If the answer is 0, you should output "0/1".

Sample Input

4

2 3

1 2

1 -1

3 3

2 1

2 2

2 3

2 1

3 5

4 -1

3 2

1 -1

1 -2

1 -3

Sample Output

-1

2 -3/2 -1/2

0

1 2/1

核心思想:

每个式子|ai⋅x+bi|,都存在一个零点,n个式子最多有n个零点,将n个零点升序排列在x轴上,这样就有n+1个区间。对于任何一个区间,ai⋅x+bi的正负是确定的,也就是可以把绝对值符号去掉。

枚举每个区间,去掉绝对值符号后合并同类项,得到方程的一个解,若此解在被枚举的区间内,则保留此解,否则舍掉此解。如果某个区间在合并同类项后x的系数为0,则分情况讨论:1、等式恒成立,则此区间任意一个实数都是方程的解,输出-1;2、等式不成立,此区间无解。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+20;
//h.v表示零点,chu.v表示解
struct node{
int a,b;
double v;
}h[N],chu[N];
int sa[N],sb[N];
bool cmp(node p,node q)
{
return p.v<q.v;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,c;
//输入
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&h[i].a,&h[i].b);
//h.v表示零点
h[i].v=-1.0*h[i].b/h[i].a;
}
//按零点升序排列
sort(h+1,h+n+1,cmp);
//求个前缀和,方便合并同类项
for(int i=1;i<=n;i++)
{
sa[i]=sa[i-1]+h[i].a;
sb[i]=sb[i-1]+h[i].b;
}
//枚举区间
int cnt=0;
int flag=0;
for(int i=0;i<=n;i++)
{
//前i个式子为正
//i+1到n个式子为负,要取负得绝对值
//ssa=sa[i]-(sa[n]-sa[i])
int ssa=2*sa[i]-sa[n];
int ssb=2*sb[i]-sb[n];
//x的系数在合并同类项后为0
if(ssa==0)
{
if(c-ssb==0)
{
//解个数无穷,输出-1
flag=1;
break;
}
}
//x的系数不是0
else
{
double te=1.0*(c-ssb)/ssa;
//判断解是否在区间内
if((i==0||te>=h[i].v)&&(i+1>n||te<h[i+1].v))
{
//约分
int t=__gcd(c-ssb,ssa);
chu[cnt].a=(c-ssb)/t;
chu[cnt].b=ssa/t;
//按照题目要求,分子的值要为正
if(chu[cnt].b<0)
{
chu[cnt].b=-chu[cnt].b;
chu[cnt].a=-chu[cnt].a;
}
chu[cnt].v=te;
cnt++;
}
}
}
//输出
if(flag)
{
printf("-1\n");
continue;
}
sort(chu,chu+cnt,cmp);
if(cnt==0)
printf("0\n");
else
{
printf("%d ",cnt);
for(int i=0;i<cnt-1;i++)
printf("%d/%d ",chu[i].a,chu[i].b);
printf("%d/%d\n",chu[cnt-1].a,chu[cnt-1].b);
}
}
return 0;
}

2019HDU暑期多校训练-1004equation-方程求解的更多相关文章

  1. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  2. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  3. MATLAB 符号变量表达式 + 方程求解

    源代码见文末 部分源代码: % 符号变量 两种表达方式 a=sym('a'); class(a); syms b; b; % 符号常量 c=sym('); c; % 符号表达式 三种表达方式 f1=' ...

  4. 洛谷——P1689 方程求解

    P1689 方程求解 题目描述 给一个方程,形如X+Y=Z或X-Y=Z.给出了其中两个未知数,请求出第三个数.未知数用‘?’表示,等式中也许会出现一些多余的空格. 输入输出格式 输入格式: 一行,方程 ...

  5. 洛谷 P1689 方程求解

    P1689 方程求解 题目描述 给一个方程,形如X+Y=Z或X-Y=Z.给出了其中两个未知数,请求出第三个数.未知数用‘?’表示,等式中也许会出现一些多余的空格. 输入输出格式 输入格式: 一行,方程 ...

  6. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  7. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  8. FESTUNG模型介绍—1.对流方程求解

    FESTUNG模型介绍-1.对流方程求解 1. 控制方程 对流问题中,控制方程表达式为 \[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) ...

  9. 2021牛客暑期多校训练营3 J 思维

    传送门 J-Counting Triangles_2021牛客暑期多校训练营3 (nowcoder.com) 题目 Goodeat finds an undirected complete graph ...

随机推荐

  1. 将elasticsearch设置为windows系统服务

    目前我都是在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch 这样直接启动的话集 ...

  2. 谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么

    整体结构 java提供了4中引用类型,在垃圾回收的时候,都有自己的各自特点. 为什么要区分这么多引用呢,其实这和Java的GC有密切关系. 强引用(默认支持模式) 把一个对象赋给一个引用变量,这个引用 ...

  3. Maven版本问题导致的 unable to import maven project, see logs for details. 问题

    新电脑安装了基础环境后,jdk,maven也都安装好了,idea安装后,导入Java项目一切正常,但是idea中code一直导入import依赖包出现问题,错误提示:unable to import ...

  4. chip based learning

    chip types Transistor mode of operation Digital chip: 0/1  -> digital clac Analog chip: sound / b ...

  5. RabbitMQ交换器的类型

    RabbitMQ常用的交换器类型有:fanout,direct,topic,headers fanout它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中. direct它会把消息路由到哪 ...

  6. UML期末复习题——2.6:Package Diagram

    第六题 包图 重要概念: 1.包图(package Diagram) 由若干个包以及包之间的关系组成.包是一种分组机制,其将一些相关的类集合为一个包,形成高内聚,低耦合的类集合,可以说,一个包相当于一 ...

  7. Android-Handler消息机制实现原理)(转)

    Android-Handler消息机制实现原理   一.消息机制流程简介 在应用启动的时候,会执行程序的入口函数main(),main()里面会创建一个Looper对象,然后通过这个Looper对象开 ...

  8. 002-多线程-JUC集合-List-CopyOnWriteArrayList

    一.概述 CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略 ...

  9. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令

    1.2.4 v-if和v-for <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  10. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...