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. Po类设计

    0.承接MySQL 表设计,同样地,这篇博客中一部分内容是Deolin的个人观点和习惯. 1.一般Po类的域是和DB表字段一一对应的, 而由于每个信息表和关联表都有id.insert_time.upd ...

  2. Dubbo——基础

    一.分布式基础理论 1.1 什么是分布式系统? “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件系 ...

  3. Liunx之基础学习

    用户提权命令之-sudo sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件 ...

  4. 牛顿法与拟牛顿法(四) BFGS 算法

    转自 https://blog.csdn.net/itplus/article/details/21897443

  5. 开发软件-IntelliJ IDEA:百科

    ylbtech-开发软件-IntelliJ IDEA:百科 IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智 ...

  6. ubuntu 切换默认python版本

    现在的python项目都是基于python3的了,再用ubuntu的时候默认的版本是py2的,所以想切换到py3上: 打开终端: sudo update-alternatives --install ...

  7. C++ STL partial_sort_copy iterator

    vector<int>::iterator iter1 = partial_sort_copy(deq1.begin(), deq1.end(), vec1.begin(), vec1.e ...

  8. stm32第一章cortex-M3处理器概述

    处理器特点 哈弗结构3级流水线内核 实现Thumb-2指令集,告别切换32位的arm指令和16位的Thumb指令,优化性能和代码密度 结合可配置的嵌套向量中段控制器Nvic,提供非屏蔽中断NMI和32 ...

  9. Milo-OPC UA处理Subscription和Triggering

    Subscription有两种模式,一种是Reporting,另一种是Sampling. 如果定义为Sampling,则这个Subscription是一个Triggered Item,即被激发的订阅, ...

  10. 【世界之大,我用Python】Ubuntu 自动删除自带软件

    起因 Ubuntu是用来做开发程序的系统,如果存在大量的"垃圾"软件就不好了吧,不仅影响系统性能而且还会经常报错,所以每次安装完系统都会清理一次系统. 操作 我清理系统一般都是直接 ...