#YHDF1561. 买木头

买木头

问题描述

nn 个木材供应商,每个供货商有长度相同一定数量的木头。长木头可以锯短,但短木头不能接长。有一个客人要求 mm 根长度相同的木头。要求计算出,此时供货商提供的木头满足客人要求的最长的长度是多少。 例如 n=2,m=30n=2,m=30,两个供货商的木头为 12,1012,1011 个供货商的木头长度为 1212 ,共有 1010 根; 5,105,1022 个供货商的木头长度为 55 ,共有 1010 根。 计算的结果为 55 ,即长度为 1212 的木头一根可锯出两根长度为 55 的木头,多余的无用,长度为 55 的木头不动,此时可得到 3030 根长度为 55 的木头。

输入格式

整数 n,m,L1,S1n,m,L_1,S_11n10000,1m1000000,1L110000,1S11001≤n≤10000,1≤m≤1000000,1≤L_1≤10000,1≤S_1≤100) 其中 L1L_1 是第一个供货商木头的长,S1S_1 是第一个供货商木头数量。其他供货商木头的长度和数量 LiL_iSiS_ii2i≥2),由下面的公式给出:

Li=((Li1×37011+10193)mod10000)+1L_i=((L_{i-1}\times 37011+10193) \mod 10000)+1

Si=((Si1×73011+24793)mod100)+1S_i=((S_{i-1}\times 73011+24793) \mod 100)+1

输出格式

一个整数,即满足要求的 mm 根长度相同的木头的最大长度。 本题测试数据保证一定有解。

数据范围

来源 2015江苏省青少年信息学奥林匹克竞赛复赛

样例

输入

10 10000 8 20

输出

201
#include <bits/stdc++.h>
using namespace std;

long long L[10010], S[10010];
int n, m;


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

	return 0;
}