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;
}

最新文章

  1. 基于GPU的高分一号影像正射校正的设计与实现
  2. selenium测试框架篇,页面对象和元素对象的管理
  3. Rational Rose :从用例图开始
  4. [Android] View.setTag(key,Object) (java.lang.IllegalArgumentException: The key must be an application-specific resource id.)
  5. U盘操作系统,Kali Linux操作系统安装
  6. WPF的Binding学习笔记(二)
  7. Backup: Flow Control in Perl6
  8. Google搜索镜像
  9. 老 base64 for xe8
  10. C++:类型转换
  11. [itint5]最大子矩阵和
  12. 关于sql row_number,rank,dense_rank,ntile函数
  13. Ubuntu下与菜单和图标相关的几个文件夹
  14. 删除所有ecshop版权和logo
  15. [转载]aptitude与apt-get的区别和联系
  16. eclipse Maven构建的project无法公布lib到tomcat的解决方法
  17. Tickets 基础DP
  18. Linux挂在ntfs格式的U盘
  19. Filter和Listener的应用——分IP统计网站访问次数
  20. 我的Python学习笔记(二):浅拷贝和深拷贝

热门文章

  1. 校庆神秘建筑(HDU 1411)
  2. 什么是Servlet容器?
  3. 解决百度文字识别SDK拍照不回调问题
  4. ColorDrawable
  5. shell生成指定范围随即整数
  6. mysql 调优 (转)
  7. PAT 甲级 1014 Waiting in Line (30 分)(queue的使用,模拟题,有个大坑)
  8. 超详细的EM算法理解
  9. swift 第六课 scrollview xib 的使用
  10. 使用STM32F103ZET霸道主板实现LCD显示屏显示