BZOJ1257:[CQOI2007]余数之和——题解+证明
http://www.lydsy.com/JudgeOnline/problem.php?id=1257
Description
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7
Input
输入仅一行,包含两个整数n, k。
Output
输出仅一行,即j(n, k)。
Sample Input
Sample Output
7
————————————————————————————————————————————
参考了http://blog.csdn.net/u013598409/article/details/47037031
预备知识:
1.等差数列求和。
2.k%i=k-k/i*i(除号均为整除,下同)
由知识2可得我们所求的答案为n*k-∑(k/i*i)
我们也可知道,i在一定的范围内时,k/i的值将唯一。
所以这给我们一个想法,即固定w=k/i,将答案变为n*k-∑(w*∑i)
那么求∑i就需要知道这个区间的左右端点,左端点即是i,而右端点r=k/w。
证明:显然i*w<=k,那么i<=k/w,取等时为边界。
然后利用等比数列求和的想法即可求得答案。
接下来设s=根号n(向下取整),简单证明算法复杂度为O(s):
显然(但我不会证明)s+m>s>n/(s+m),也就是说s处于一个对称轴的位置,他之后的数(即[s+1,n])被n除后一定可以映射到[1,s]之中,即最大数量为s个。
那么反着推[1,s]被n除后映射的最大数量也应该是s个
所以我们能够发现w的取值个数最大有2*s个。
即算法复杂度为O(2*s)
#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll n,k;
scanf("%lld%lld",&n,&k);
ll ans=n*k;
if(n>k)n=k;
int l,r,j;
for(int i=;i<=n;i=r+){
j=k/i,l=i,r=k/j;
if(r>=n)r=n;
ans-=(ll)(l+r)*(r-l+)*j/;
}
printf("%lld\n",ans);
return ;
}
BZOJ1257:[CQOI2007]余数之和——题解+证明的更多相关文章
- BZOJ1257 CQOI2007 余数之和 【数分块】
BZOJ1257 CQOI2007 余数之和 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值 其中 ...
- bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum
http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #includ ...
- bzoj1257[CQOI2007]余数之和(除法分块)
1257: [CQOI2007]余数之和 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 6117 Solved: 2949[Submit][Statu ...
- bzoj1257: [CQOI2007]余数之和 整除分块
题意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod ...
- BZOJ1257 [CQOI2007]余数之和sum
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj1257: [CQOI2007]余数之和sum(数论)
非常经典的题目... 要求 则有 实际上 最多只有2*sqrt(k)种取值,非常好证明 因为>=sqrt(k)的数除k下取整得到的数一定<=sqrt(k),而k除以<=sqrt(k) ...
- [BZOJ1257][CQOI2007]余数之和
题目大意 给你 \(n, k\),计算 $ \sum_{i=1}^n k \bmod i$ 解析 注意到 $ k\bmod i=k-[k/i] \times i$ 则上式等于 $ n \times k ...
- [BZOJ1257][CQOI2007]余数之和sum 数学+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1257 题目所求为$$Ans=\sum_{i=1}^nk%i$$ 将其简单变形一下$$Ans ...
- BZOJ1257: [CQOI2007]余数之和——整除分块
题意 求 $\sum _{i=1}^n k \ mod \ i$($1\leq n,k\leq 10^9$). 分析 数据范围这么大 $O(n)$ 的复杂度也挺不住啊 根据取模的意义,$k \ mod ...
随机推荐
- Android 模拟器下载、编译及调试
Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...
- 客户端SDK测试思路
本文来自网易云社区 作者:万春艳 是什么 客户端SDK是为第三方开发者提供的软件开发工具包,包括SDK接口.开发文档和Demo示例等.SDK和应用之间是什么关系呢?以云信即时消息服务为例,如下图所示, ...
- 怎样用Eclipse将Java源代码生成可执行文件[转]
eclipse将java源代码生成jar可执行文件 用eclipse做了一个web项目的自动化测试,自己用的时候倒是很方便,打开eclipse直接运行即可,但是分享给其他小伙伴用的时候就不太方便,希望 ...
- Siki_Unity_2-1_API常用方法和类详细讲解(下)
Unity 2-1 API常用方法和类详细讲解(下) 任务101&102:射线检测 射线origin + direction:射线检测:射线是否碰撞到物体 (物体需要有碰撞器),碰撞物体的信息 ...
- C if语句判断年龄
#include <stdio.h> int main(int argc, char **argv) { //新建两个变量给变量赋值跟初始化:const int a=45;int c=0; ...
- js写的数码时钟,在“最小化”浏览器 或者 “切换网页”是动画效果好像不对
一.问题 在“最小化”浏览器 或者 “切换网页”是动画效果不对,不知道哪里出了问题???是不是”最小化“时网页定时器关掉了,还是其他什么原因啊 ???? 二.HTML代码如下 <div id=& ...
- 原生js实现轮播图原理
轮播图的原理1.图片移动实现原理:利用浮动将所有所有照片依次排成一行,给这一长串图片添加一个父级的遮罩,每次只显示一张图,其余的都隐藏起来.对图片添加绝对定位,通过控制left属性,实现照片的移动. ...
- leetcode-颜色分类
颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示 ...
- 【递归入门】组合+判断素数:dfs(递归)
题目描述 已知 n 个整数b1,b2,…,bn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- SIG蓝牙mesh笔记2_mesh组成
目录 SIG 蓝牙 mesh 组成 mesh网络概述 网络和子网 设备和节点 devices & nodes 入网 mesh中的几个概念 智能插座例子 SIG 蓝牙 mesh 组成 mesh网 ...