CF1068A 题解

发布时间 2024-01-06 19:13:42作者: lemon-cyy

其实很简单的一道题。

思维路径

其实题目主要要考虑的就是以下三个条件。

  • 每个人都要送一样多的硬币。
  • 每个硬币都必须是不同的。
  • 所有人送的硬币至少有 \(L\) 个是 Ivan 没有的。

我们一个一个来看。

  1. 每个人都要送一样多的硬币。

一共有 \(M\) 个朋友,所以说总共送的硬币的个数为 \(M\) 的倍数即可满足

  1. 每个硬币都必须是不同的。

一共只有 \(N\) 种硬币,也就是说送的硬币的个数最多 \(N\) 个,这一条对于数的大小做了限定。

  1. 所有人送的硬币至少有 \(L\) 个是 Ivan 没有的。

Ivan 原先有 \(K\) 种硬币,要保证至少 \(L\) 个是 Ivan 没有的,根据抽屉原理,至少要送 \(K+L\) 种硬币。

综上,我们需要找一个在 \([K+L,N]\) 区间内的 \(M\) 的倍数,寻找方式程序实现很容易,有需求的可以来问。

实现细节

注意数据范围 \(10^{18}\),一定要用 long long,一定不要随随便便相乘。(这边用的是unsigned long long)

AC 代码


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull n,m,k,l;

void input(){
	cin>>n>>m>>k>>l;
}

void solve(){
	if((k+l)<=n&&(k+l)%m==0) cout<<(k+l)/m;
	else if(((k+l)/m+1)*m<=n) cout<<(k+l)/m+1;
	else cout<<"-1";
}

int main(){
	input();
	solve();
	return 0;
}