题目
有 n
个线性序列,第 i
个序 列可以表示成 ki×x+bi
的形式(x=0,1,2,…)。
请问将这些序列的数合并起来后,第 m
小的数是多少(重复出现的数合并后也会多次出现)。
输入格式
输入第一行一个数 n
接下来 n
行每行两个数表示 ki,bi
最后一行一个数 m
输出格式
输出一个数表示答案。
样例输入
2
1 2
5 2
8
样例输出
7
数据规模
对于 100%的数据,保证 1≤n≤100000,1≤m≤100000,1≤ki,bi≤1000
这是、代码,但是我没听懂,有没有人再帮我详细的讲一下,谢谢!
#include<bits/stdc++.h>
using namespace std;
int n,m,k[100001],b[100001];
long long calc(int x){
long long y=0;
for(int i=1;i<=n;i++){
if(b[i]<=x)
y+=(x-b[i])/k[i]+1;
}
return y;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&k[i],&b[i]);
}
scanf("%d",&m);
int L=0,R=1<<31;
while(L+1<R){
int w=(L+R)/2;
if(calc(w)<m){
L=w;
}
else{
R=w;
}
}
printf("%d\n",R);
return 0;
}