当前位置: 首页 > news >正文

整除分块 2025牛客寒假算法基础集训营3G

G33 整除分块(数论分块)_哔哩哔哩_bilibili

对于每个i, 1 <= i <= n    n / i 下取整的值最多有2 * sqrt(n)种 并且数字x所在块的值为 n / (n / i)

这一题, 每个块中余数是一个以除数为公差的等差数列, 二分第k大的数可能为几即可 , 二分的思路与E题极为相似

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
struct info {
	int hi, lo, div;
};
bool cmp(info a, info b) {
	return a.hi < b.hi;
}

void solve(){
	
	int n, k;
	cin >> n >> k;
	map<int, int> next;
	for(int i = 1; i <= n; ) {
		next[i] = n / (n / i);
		i = next[i] + 1;
	}
	vector<info> a;
	for(int i = 1; i <= n;) {
		int div = n / i;
		int hi = n % i;
		int lo = n % next[i];
		a.push_back({hi,lo,div});
		i = next[i] + 1;
	}
	ll ans = 0;
	auto check = [&] (int x) -> bool {
		int cnt = 0;
		ll res = 0;
		for(auto it : a) {
			if(x > it.hi) continue;
			int z = (it.hi - max(it.lo, x) ) / it.div + 1;
			cnt += z;
			res += (it.hi + it.hi - it.div * 1ll * (z - 1)) * z / 2;
		}
		ans = res - (cnt - k) * x;
		return cnt >= k;

	};

	int lo = -1, hi = n + 1;
	while(lo + 1 < hi) {
		int mid = lo + hi >> 1;
		if(check(mid)) lo = mid;
		else hi = mid;
	}
	check(lo);
	cout << ans << endl;



	
}


int main(){
	std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

	int T = 1;
	//cin >> T;
	while(T--) solve();

	return 0;
}

相关文章:

  • bfs求解迷宫问题
  • 无人机投屏技术解码过程详解!
  • docker引擎常用目录文件详解
  • 【系统架构设计师】以数据为中心的体系结构风格
  • Better-SQLite3 参数绑定详解
  • 二叉树的遍历
  • 【人工智能】Open WebUI+ollama+deepSeek-r1 本地部署大模型与知识库
  • 【Git】基本指令
  • 【全球化2.0 | ZStack发布Zaku容器云海外版 加速亚太生态布局
  • python项目中连接数据库详细版
  • Ubuntu搭建最简单WEB服务器
  • centos8 虚拟机重启后无法识别网卡 ens33 问题原因总结
  • 算法训练(leetcode)二刷第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • 最短路问题
  • linux上配置免密登录
  • 【每日五题系列】前端面试高频题目
  • VSCode 配置优化指南:打造极致高效的前端开发环境
  • 如何高效使用 Mybatis-Plus 的批量操作
  • java中小型公司面试预习资料(一):基础篇
  • python文本处理pdfminer库安装与使用
  • 手机网站缩放/水平优化
  • 松江新城做网站公司/网络营销手段有哪些方式
  • 备案网站/北京网站优化seo
  • flask做的网站如何上传/微信营销软件哪个好用
  • 动漫网站设计论文/免费seo教程
  • 免费教做面食的网站/竞价推广托管