题目大意

  有 \(n\) 个人排成一个圈,你有 \(k\) 颗糖,你要从第 \(l\) 个人开始发糖,直到第 \(r\) 个人拿走最后一颗糖。注意这 \(n\) 个人拍成了一个圈,所以第 \(n\) 个人拿完后会轮到第 \(1\) 个人拿。第 \(i\) 个人每次拿走的糖的数量是 \(a_i\)(由你决定)。如果第 \(r\) 个人要拿两个糖且只剩下一颗糖,那么他就只会拿走这一颗。问你最多能让多少个人每次拿两颗糖。

  \(n,k\leq {10}^{11}\)

题解

  分 \(n\) 小和 \(n\) 大两部分考虑。

  如果 \(n\) 比较小,就可以枚举答案,然后判断 \(l\sim r\) 这些人能不能拿走 \(k\bmod (ans+n)\) 颗糖。

  具体来说,这些人拿走的糖的数量 \(s\) 必须满足 \(mi\leq s\leq ma\),其中

\[\begin{align}
mi&\geq ans-n+len-1\\
mi&\geq 0\\
ma&\leq ans\\
ma&\leq len\\
\end{align}
\]

  如果 \(n\) 比较大,那么就可以枚举最少那个人拿了几次糖 \((i)\)。

  记 \(k_1\) 为所有人拿的糖的数量的和,\(k_2\) 为 \(l\sim r\) 的人拿的糖的数量,那么就有

\[\begin{align}
ik_1+k_2&=k\\
mi&\geq k_1-n-n+len-1+len\\
mi&\geq len\\
ma&\leq k_1-n+len\\
ma&\leq len+len\\
mi&\leq k_2\leq ma\\
ik_1+mi&\leq k\leq ik_1+ma\\
ik_1+2len+k_1-2n-1&\leq k\\
ik_1+len&\leq k\\
ik_1+len+k_1-n&\geq k\\
ik_1+2len&\geq k\\
k_1&\leq \frac{k-2len+2n+1}{i+1}\\
k_1&\leq \frac{k-len}{i}\\
k_1&\geq \frac{k-2len}{i}\\
k_1&\geq \frac{k-len+n}{i+1}
\end{align}
\]

  然后找出这个范围内最大的 \(k_1\) 就好了。

  时间复杂度:\(O(\sqrt k)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
#include<iostream>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
using std::cin;
using std::cout;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUG
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
typedef long double ldb;
ll n,k;
ll l,r;
ll ans=-1;
ll len;
int main()
{
open("d");
cin>>n>>l>>r>>k;
len=(r>=l?r-l+1:n-l+1+r);
if(n<=1000000)
{
for(int i=n;i<=2*n;i++)
{
ll s=k%i;
if(s==0)
s=i;
s-=len;
ll mi=max(i-n-(n-len)-1,0ll);
ll ma=min(len,i-n);
if(s>=mi&&s<=ma)
ans=max(ans,i-n);
}
}
else
{
if(k>=len&&k<=2*len)
ans=max(ans,k==2*len?n:n-len+k-len+1);
for(int i=1;i<=k/n;i++)
{
ll s2=min((k-2*len+2*n+1)/(i+1),(k-len)/i);
ll s1=max((k-2*len+i-1)/i,(k-len+n+i)/(i+1));
if(s1<=s2)
ans=max(ans,s2-n);
}
}
cout<<ans<<std::endl;
return 0;
}

【CF1063D】Candies for Children 数学的更多相关文章

  1. CF1063D Candies for Children

    CF1063D Candies for Children 分类讨论题 n<=1e11, 整体上先分n<=2e6与否讨论 len长度,ans贪心的人,p就是len这一段贪心的人 n<= ...

  2. Codeforces 1063D Candies for Children

    题目大意 给定整数 $n, k, l, r$,$1\le n, k \le 10^{11}$,$1\le l, r \le n$ . 令 $ m = r - l + 1$,若 $m \le 0$,$m ...

  3. Codeforces Round #575 (Div. 3) (A. Three Piles of Candies)(数学)

    A. Three Piles of Candies time limit per test1 second memory limit per test256 megabytes inputstanda ...

  4. Codeforces1063D Candies for Children 【分类讨论】【暴力】

    题目分析: 首先要想两个暴力,一个的时间复杂度是$O(n^2)$,另一个是$O([\frac{n}{k}])$的. $n^2$的暴力可以枚举两段,一段有$i$个取两个的小朋友,一段有$j$个取两个的小 ...

  5. HDU 6126.Give out candies 最小割

    Give out candies Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  6. Codeforces Round #516(Div 2)

    比赛链接:传送门 A. Make a triangle!(简单思维) 题目大意: 给你三条边,问你最多加多少长度能使这三条边能构成三角形. 思路: 最大边小于答案加另外两条边的和. #include ...

  7. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

    题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...

  8. Codeforces Round #516 (Div. 2) (A~E)

    目录 Codeforces 1064 A.Make a triangle! B.Equations of Mathematical Magic C.Oh Those Palindromes D.Lab ...

  9. CodeForces Round #516 Div2 题解

    A. Make a triangle! 暴力... 就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形 #include <bits/stdc++.h> #define ll ...

随机推荐

  1. C#工具:ASP.NET MVC单例模式(懒汉)实现文件上传

    1.SingletonConfigRead帮助类 using System; using System.Collections.Generic; using System.IO; using Syst ...

  2. C# 实体类转json数据过滤掉字段为null的字段

    C# 实体类转json数据过滤掉字段为null的字段 语法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = N ...

  3. ASP.NET Core的JWT的实现(中间件).md

    既然选择了远方,便只顾风雨兼程 __ HANS许 JWT(JSON Web Token) ASP.NET Core 的Middleware实现 引言:挺久没更新了,之前做了Vue的系列,后面想做做服务 ...

  4. Spring Boot Security 详解

    简介 Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权. 工作 ...

  5. 腾讯云申请SSL证书与Nginx配置Https

    0x00 为什么要安装证书 信息传输的保密性 数据交换的完整性 信息的不可否认性 交易者身份确定性 如今各大浏览器厂商不断推进Https安全访问强制性要求,为了避免以后网站数据量增多时安装证书造成不必 ...

  6. SVN的使用说明

    SVN管理版本是比较好的东西,但是我的SVN图标老是不出来,有时候莫名其妙就没有了,所以记录一下处理办法: 1.右键->TortoiseSVN->Settings->Icon Ove ...

  7. Oracle dblink的连接模式的关系测试总结

    这篇主要介绍一下database link由于连接数据库的方式不同遇到的一些问题,我们知道连接ORACLE服务器的模式一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接 ...

  8. Problem of Creating Topics in Kafka with Kerberos

    Hi, After enabled Kerberos using Ambari, I got problem creating topics in Kafka using the kafka-topi ...

  9. Scala操作Hbase空指针异常java.lang.NullPointerException处理

    Hbase版本:Hortonworks Hbase 1.1.2 问题描述:使用Scala操作Hbase时,发生空指针异常(java.lang.RuntimeException: java.lang.N ...

  10. element-ui笔记

    1.el-dialog的关闭异常 在confirm按钮事件中,我们需要对业务参数进行校验,但是校验未通过,return false了,仍然关闭了弹窗. 原因:cancel按钮的click直接将弹窗的s ...