应该只有判断成无解的问题,看了数据。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int ans, n, k, x, y, s[100005], t[100005];
int ceildiv(int a ,int b)
{
if(a >= 0 && b >= 0) return (a + b - 1) / b;
if(a <= 0 && b >= 0) return a / b;
if(a <= 0 && b <= 0) return a = -a,b = -b,(a + b - 1) / b;
if(a >= 0 && b <= 0) return a / b;
}
void case1(int i)
{
int a = 0;
// if(s[n] + t[n] - n * k == 0)cout<<1<<endl;
if(s[n] + t[n] - n * k > 0)
a = min((i * k + x + y - t[i] - s[i]) / (s[n] + t[n] - n * k),0ll);
if(s[n] + t[n] - n * k < 0)
a = ceildiv((i * k + x + y - t[i] - s[i]) , (s[n] + t[n] - n * k));
if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y >= 0 && a * s[n] + s[i] - x + a * t[n] + t[i] - y <= a * n * k + i * k)
ans = min(ans,a * n + i);
}
void case2(int i)
{
int a = 0;
// if(s[n] - t[n] - n * k == 0)cout<<2<<endl;
if(s[n] - t[n] - n * k > 0)
a = min((i * k + x - y + t[i] - s[i]) / (s[n] - t[n] - n * k),0ll);
if(s[n] - t[n] - n * k < 0)
a = ceildiv((i * k + x - y + t[i] - s[i]) , (s[n] - t[n] - n * k));
if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y <= 0 && a * s[n] + s[i] - x - a * t[n] - t[i] + y <= a * n * k + i * k)
ans = min(ans,a * n + i);
}
void case3(int i)
{
int a = 0;
// if(-t[n] - s[n] - n * k == 0)cout<<3<<endl;
if(-t[n] - s[n] - n * k > 0)
a = min((i * k - x - y + t[i] + s[i]) / (-t[n] - s[n] - n * k),0ll);
if(-t[n] - s[n] - n * k < 0)
a = ceildiv((i * k - x - y + t[i] + s[i]) , (-t[n] - s[n] - n * k));
if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y <= 0 && x + y - s[i] - t[i] - a * s[n] - a * t[n] <= a * n * k + i * k)
ans = min(ans,a * n + i);
}
void case4(int i)
{
int a = 0;
// if(t[n] - s[n] - n * k == 0)cout<<4<<endl;
if(t[n] - s[n] - n * k > 0)
a = min((i * k - x + y - t[i] + s[i]) / (t[n] - s[n] - n * k),0ll);
if(t[n] - s[n] - n * k < 0)
a = ceildiv((i * k - x + y - t[i] + s[i]) , (t[n] - s[n] - n * k));
if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y >= 0 && x - s[i] - a * s[n] + a * t[n] + t[i] - y <= a * n * k + i * k)
ans = min(ans,a * n + i);
}
void solve()
{
scanf("%lld%lld%lld%lld",&n,&k,&x,&y);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&s[i],&t[i]);
s[i] += s[i-1];
t[i] += t[i-1];
}
ans = 9e18;
for(int i=0;i<=n;i++)
{
case1(i);
case2(i);
case3(i);
case4(i);
}
if(ans == 9e18)ans = -1;
printf("%lld\n", ans);
}
signed main()
{
int t;cin>>t;
while(t--) solve();
return 0;
}