
样例输入 :
10 10000 8 20
样例输出:
201
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l[10010],s[10010];
int n,m,suml=0,maxl=0;
bool check(int mid){
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=l[i]/mid*s[i];
}
return cnt>=m;
}
signed main(){
cin>>n>>m>>l[1]>>s[1];
for(int i=2;i<=n;i++){
l[i]=((l[i-1]*37011+10193)%10000)+1;
s[i]=((s[i-1]*73011+24793)%100)+1;
suml+=l[i]*s[i];
maxl=max(maxl,l[i]);
}
if(suml<m){
cout<<0;
return 0;
}
int l=1,r=maxl,mid;
while(l<r){
mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
┌───────────────┐
│ 程序开始 │
└───────┬───────┘
▼
┌───────────────┐
│ 声明全局变量 │
│ l[10010], s[10010] │
│ n, m, suml=0, maxl=0 │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 定义check函数 │
│ 参数:mid(待检查的段长) │
│ 步骤1:初始化cnt=0 │
│ 步骤2:循环i=1到n │
│ ├─ 计算l[i]/mid * s[i] │
│ └─ 累加至cnt │
│ 步骤3:返回cnt >= m │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 主函数main │
│ 步骤1:输入n, m, l[1], s[1] │
│ 步骤2:循环i=2到n │
│ ├─ 生成l[i] = (l[i-1]*37011+10193)%10000 +1 │
│ ├─ 生成s[i] = (s[i-1]*73011+24793)%100 +1 │
│ ├─ suml += l[i] * s[i] │
│ └─ maxl = max(maxl, l[i]) │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 判断suml < m? │
│ ├─ 是 → 输出0,程序结束 │
│ └─ 否 → 进入二分查找 │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 二分查找初始化 │
│ l=1, r=maxl, mid未定义 │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 循环:当l < r时 │
│ 步骤1:mid = (l + r + 1) >> 1 │
│ 步骤2:调用check(mid)? │
│ ├─ 是 → l = mid │
│ └─ 否 → r = mid - 1 │
└───────┬───────┘
▼
┌─────────────────────────────────┐
│ 输出l(最大段长) │
└───────┬───────┘
▼
┌───────────────┐
│ 程序结束 │
└───────────────┘


被折叠的 条评论
为什么被折叠?



