分块+二分

这道题思路很巧妙

我们大概可以推出一个式子sigma(d-[(ai-1)%d+1])<=k,要求求出d的最大值

然后我们化简一下,sigma(d-[(ai-1)-[(ai-1)/d]*d+1])<=k -> sigma(d-ai-[(ai-1)/d]*d)<=k

直接枚举肯定炸,但是我们看见里面有一个下取整除法,我们想到了什么?莫比乌斯反演中的分块技巧!那么我们可以通过分块来减少枚举d的复杂度,然后在一定取值范围内二分就行了!

然后,我们对于每个ai-1查找分块对应端点的最小值,也就是一段使得(ai-1)/d第一个变化的值,而其他值没有变化,也就是说我们对于每个ai枚举分块端点值后,每两个值相邻区间的值不会改变任何一个(ai-1)/d的值。

然后每个ai有sqrt(ai)个值,那么一共就有n*sqrt(max(ai))的值,然后我们从大到小枚举每个值,如果一个值满足条件,那么我们需要二分找出满足答案的最大值,因为这个值只是在从这个值到下一个值-1这一段区间内任意(ai-1)/d不变,但是不一定满足,由于现在(ai-1)/d不变,那么上面那个式子就满足单调性了,于是就可以二分了。

如果枚举的值范围过大,我们在看见除法的情况下可以用分块优化,可以大大降低复杂度,因为分块求出使一个值变化的最小的除数,这样我们就可以求出所有区间使得取这个区间内任意一个值所有数做除法的商不变

最后push_back(j)是(ai-1)/d==0,其实也就是ai

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
long long k, ans, sum, m;
long long a[N];
vector<long long> v;
int main()
{
scanf("%d%I64d", &n, &k);
for(int i = ; i <= n; ++i) scanf("%I64d", &a[i]), sum += a[i], m = max(m, a[i]);
long long tot = k + m;
for(int i = ; i <= n ; ++i)
{
long long j, t;
for(j = , t = ; j < a[i] && t < a[i]; j = t + )
v.push_back(j), t = (a[i] - ) / ((a[i] - ) / j);
v.push_back(j);
}
for(int i = ; i < v.size(); ++i) printf("%I64d ", v[i]);
puts("");
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
v.push_back(100000000000000ll);
for(int i = v.size() - ; i >= ; --i)
{
long long x = v[i];
long long tot = ;
for(int j = ; j <= n; ++j) tot += (a[j] - ) / x;
if(x * tot <= k + sum - (long long)n * x)
{
long long l = x - , r = v[i + ];
while(r - l > 1ll)
{
long long mid = (l + r) >> 1ll;
if(mid * tot <= k + sum - (long long)n * mid) l = ans = mid;
else r = mid;
}
break;
}
}
cout << ans << endl;
return ;
}

830C的更多相关文章

  1. Codeforces 830C On the Bench

    题意:给你n个数,问有多少种排列方式使得任意两个相邻的数的乘积都不是完全平方数 我好弱,被组合和数论吊着打... 首先我们可以把每个数中固有的完全平方数给分离出来,那么答案其实就只与处理后的序列相关. ...

  2. Codeforces 830C Bamboo Partition 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF830C.html 题解 把问题转化成求最大的 $d$ ,满足$$\sum_{1\leq i \leq n}( ...

  3. Codeforces 830C Bamboo Partition (看题解)

    Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...

  4. 【CodeForces 830C】奇怪的降复杂度

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60638239 description 有n棵竹子 ...

  5. utf-8 汉字对照表

    之前从redis中取出一些数据,utf8 16进制编码,想转成字符,没有找到现成的转化工具,先用这个表直接查找对照吧. UTF8编码表大全Code code# Code (coded in UTF-8 ...

  6. JS base64 加密和 后台 base64解密(防止中文乱码)

    直接上代码 1,js(2个文件,网上找的)  不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...

  7. 基于nodejs实现js后端化处理

    今天D哥给我提了个问题,"用php执行过js没"?咋一听,没戏~~毕竟常规情况下,js是依赖浏览器运行的.想在php后端采集的同时利用js运行结果并传递给php使用,没戏! 然后回 ...

  8. usb.ids

    # # List of USB ID's # # Maintained by Vojtech Pavlik <vojtech@suse.cz> # If you have any new ...

  9. utf8汉字编码16进制对照

           utf8汉字编码16进制对照  GB    Unicode  UTF-8     Chinese Character Code  code# Code      (coded in UT ...

随机推荐

  1. Tomcat8.0 JDK1.8 的详细配置 Win10

    官网下载 先安装JDK以及JRE 之后安装Tomcat jdk配置环境变量: 用户变量:path:C:\Program Files\Java\jdk1.8.0_161\bin     ( jdk安装的 ...

  2. MyBatis 返回Map<String,Object>类型

    <!-- 导出所有数据 --> <select id="exportAll" resultMap="map"> SELECT t1.ME ...

  3. Microsoft Azure 资料整理

    鉴于Microsoft Azure的技术迭代更新相当快,所以推荐大家还是以官方文档为准. 以Global Azure 的为主,Mooncake版本自行删减 首先推荐Azure for MSDN htt ...

  4. js在HTML中的三种写法

    1.内联样式 内联样式分为两种,一是直接写入元素的标签内部 <html> <title>js样式内联写法</title> <meta http-equiv=& ...

  5. 九度oj 题目1202:排序

    题目1202:排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:28802 解决:9408 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n ...

  6. NYOJ-58最少步数,广搜思想!

    最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 ->   Link  <- 这个题深搜广搜都是可以的,迷宫已经给出了,就看怎么做了:一般起点终点确定用广搜 ...

  7. 2015 湘潭大学程序设计比赛(Internet)部分题解,其中有一个题与NYOJ1057很像,贪心过~~

    仙剑奇侠传                 祝玩的开心                                                                          ...

  8. UVa 12563_Jin Ge Jin Qu hao

    [题意]在KTV唱歌,假设每首歌最长180s,时间结束时如果还有歌正在唱,则将此歌唱完.为使唱歌时间最长,规定最后唱长达678s的<劲歌金曲>[介是个嘛?] 假设你正在唱KTV,在剩余的t ...

  9. cocos2d-x CCScrollView和CCTableView的使用

    在游戏和应用中常常要实现左右滑动展示游戏帮助.以列表显示内容的UI效果,就像android中的Gallery和ListView. 本文通过CCScrollView和CCTableView分别来实现这两 ...

  10. 将github上的项目源码导入eclipse详细教程

    将github上的项目源码导入eclipse详细教程 学习了: http://blog.csdn.net/itbiggod/article/details/78462720