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

整除分块 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;
}


http://www.kler.cn/a/573760.html

相关文章:

  • Kotlin 协程(三)协程的常用关键字使用及其比较
  • Visual Stdio 2022 C#调用DeepSeek API
  • HCIA—IP路由静态
  • koa-session设置Cookie后获取不到
  • C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例1
  • 涨薪技术|持续集成Git使用详解
  • 机器人“照镜子”:开启智能新时代
  • Apache Tomcat 新手入门指南:从安装到部署的全流程解析
  • 高频 SQL 50 题(基础版)_1141. 查询近30天活跃用户数
  • leetcode344----反转字符串
  • 正则表达式梳理(基于python)
  • 学习记录-缺陷
  • 2.数据结构:7.模拟堆
  • AI绘画软件Stable Diffusion详解教程(5):主模型的选择
  • 数据守护者:备份文件的重要性与自动化实践策略
  • 面试题汇总(一)
  • 将自定义vue组件加载在Mapbox或Maplibre的marker和popup上
  • SpringBoot3—场景整合:NoSQL
  • 开源模型应用落地-LangGraph101-探索 LangGraph人机交互-添加断点(一)
  • 准确---Liunx查看出口ip的命令