830C
分块+二分
这道题思路很巧妙
我们大概可以推出一个式子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的更多相关文章
- Codeforces 830C On the Bench
题意:给你n个数,问有多少种排列方式使得任意两个相邻的数的乘积都不是完全平方数 我好弱,被组合和数论吊着打... 首先我们可以把每个数中固有的完全平方数给分离出来,那么答案其实就只与处理后的序列相关. ...
- Codeforces 830C Bamboo Partition 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/CF830C.html 题解 把问题转化成求最大的 $d$ ,满足$$\sum_{1\leq i \leq n}( ...
- Codeforces 830C Bamboo Partition (看题解)
Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...
- 【CodeForces 830C】奇怪的降复杂度
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60638239 description 有n棵竹子 ...
- utf-8 汉字对照表
之前从redis中取出一些数据,utf8 16进制编码,想转成字符,没有找到现成的转化工具,先用这个表直接查找对照吧. UTF8编码表大全Code code# Code (coded in UTF-8 ...
- JS base64 加密和 后台 base64解密(防止中文乱码)
直接上代码 1,js(2个文件,网上找的) 不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...
- 基于nodejs实现js后端化处理
今天D哥给我提了个问题,"用php执行过js没"?咋一听,没戏~~毕竟常规情况下,js是依赖浏览器运行的.想在php后端采集的同时利用js运行结果并传递给php使用,没戏! 然后回 ...
- usb.ids
# # List of USB ID's # # Maintained by Vojtech Pavlik <vojtech@suse.cz> # If you have any new ...
- utf8汉字编码16进制对照
utf8汉字编码16进制对照 GB Unicode UTF-8 Chinese Character Code code# Code (coded in UT ...
随机推荐
- LeetCode(88)Merge Sorted Array
题目 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note ...
- cookie、localStorage和sessionStorage三者的异同
1.三者都是用来存储浏览器数据的 2.生命周期:cookie可以设置数据失效时间,默认是关闭浏览器后失效:localStorage中的数据是永久保存的,除非手动清除:sessionStorage的数据 ...
- centOS 7 换ssh端口
centos 最少安装时缺少semanage的,要这样装补上,因为默认是安装了SElinux的 [root@localhost ~]# sestatus SELinux status: enabled ...
- POJ 3469 网络流最小割
将两个CPU分别视作源点和汇点 对于那些不在同一个CPU中的模块会产生的代价作为一条双向的容量弧 这里每个模块可以在任意一个CPU中运行,相当于寻找一个割,分割后,在S集合中的模块安装在第一个CPU中 ...
- [luoguP1472] 奶牛家谱 Cow Pedigrees(DP)
传送门 一个深度为i的树可以由一个根节点外加两个深度为i-1的树组成,这就决定了DP该怎么写. 然而我真的没有想到. f[i][j]表示深度为i节点数为j的个数 sum[i][j]表示深度小于等于i节 ...
- BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数
题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...
- [NOIP2006] 提高组 洛谷P1066 2^k进制数
题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...
- Linux下汇编语言学习笔记21 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- SQLSERVER数据库管理员的专用连接DAC
出处: http://www.cnblogs.com/lyhabc/archive/2012/09/23/2698702.html DAC:Dedicated Admin Connection 当SQ ...
- cogs——2084. Asm.Def的基本算法
2084. Asm.Def的基本算法 ★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “有句 ...