CF1068A 题解
其实很简单的一道题。
思维路径
其实题目主要要考虑的就是以下三个条件。
- 每个人都要送一样多的硬币。
- 每个硬币都必须是不同的。
- 所有人送的硬币至少有 \(L\) 个是 Ivan 没有的。
我们一个一个来看。
- 每个人都要送一样多的硬币。
一共有 \(M\) 个朋友,所以说总共送的硬币的个数为 \(M\) 的倍数即可满足
- 每个硬币都必须是不同的。
一共只有 \(N\) 种硬币,也就是说送的硬币的个数最多 \(N\) 个,这一条对于数的大小做了限定。
- 所有人送的硬币至少有 \(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;
}
本文来自博客园,作者:lemon-cyy,转载请注明原文链接:https://www.cnblogs.com/lemon-cyy/p/17949392