洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块
参考:题解
令f(i)=k%i,[p]表示不大于p的最大整数
f(i)=k%i=k-[k/i]*i
令q=[k/i]
f(i)=k-qi
如果k/(i+1)=k/i=q
f(i+1)=k-q(i+1)=k-qi-q=f(i)-q
于是,对于区间[l,r],使其之内任意两个整数i,j,都满足k/i=k/j,
则f(l)到f(r)是一个递减的等差数列,公差为[k/i]。
现在就是要把1到n分成这样的一些区间,设某个区间的商(公差)为p
设区间内某数为x,则现在要做的是解方程[k/x]=p
显然px<=k,因此x<=k/p,得出这个区间的最大的x也就是r=[k/p],
显然,l=[k/(p+1)]+1
数的个数为r-l+1
#include<cstdio>
typedef long long LL;
LL ans,n,k;
LL min(LL a,LL b)
{
return a>b?b:a;
}
int main()
{
LL r;
scanf("%lld%lld",&n,&k);
// LL minp=k/n,p;
// LL maxp=min(n,k);
// for(p=minp;p<=maxp;p++)
// {
// l=k/(p+1)+1;
// if(p==0)
// r=n;
// else
// r=min(n,k/p);
// if(l<=r)
// {
// ans+=(r-l+1)*(k%l+k%r)/2;
// }
// }//太慢了,时间复杂度还是接近O(n),有大量多余循环
LL p,q;
for(int i=;i<=n;i++)
{
//此处能循环到的i就是上面方法的l
p=k/i;
q=k%i;
//从i开始的区间,r就是min(n,[k/(k/i)])
if(p==)
r=n;
else
r=min(n,k/p);
ans+=(r-i+)*(q+k%r)/;
i=r;
}
printf("%lld",ans);
return ;
}
这可以称为整除分块例题了。。。
$$\sum_{i=1}^nk\%i=\sum_{i=1}^n(k-i*{\lfloor}{\frac{k}{i}}{\rfloor})=n*k-\sum_{i=1}^n(i*{\lfloor}{\frac{k}{i}}{\rfloor})$$
最后的那个直接整除分块即可。。。
整除分块的话,就是因为${\lfloor}{\frac{k}{i}}{\rfloor}(i为整数且1<=i<=k)$的值只有$\sqrt{k}$级别个
原因:对于小于等于$\sqrt{k}$的i,每一个产生一个${\lfloor}{\frac{k}{i}}{\rfloor}$,最多产生$\sqrt{k}$个;对于大于$\sqrt{k}$的i,产生的${\lfloor}{\frac{k}{i}}{\rfloor}$都小于$\sqrt{k}$,最多有$\sqrt{k}$个。合起来也是$\sqrt{k}$级别个
那么只要枚举每一种${\lfloor}{\frac{k}{i}}{\rfloor}$,根据要求的式子的一些性质计算即可
(比如此题就是在${\lfloor}{\frac{k}{i}}{\rfloor}$相等时就相当于$p*\sum_{i=l}^ri$,$p$为那个${\lfloor}{\frac{k}{i}}{\rfloor}$)
当然不太可能直接枚举每一种${\lfloor}{\frac{k}{i}}{\rfloor}$,事实上还是枚举i,然后直接从i"跳"到j,使得j是满足${\lfloor}{\frac{k}{j}}{\rfloor}$与${\lfloor}{\frac{k}{i}}{\rfloor}$相等的最大数
如何跳?设${\lfloor}{\frac{k}{j}}{\rfloor}=p$,则$p+1>{\frac{k}{j}}>=p$,则$j*(p+1)>k>=p*j$,则${\frac{k}{p+1}}<j<={\frac{k}{p}}$
因此枚举出一个i后,$p={\lfloor}{\frac{k}{i}}{\rfloor}$,那么要跳到的j就是${\lfloor}{\frac{k}{{\lfloor}{\frac{k}{i}}{\rfloor}}}{\rfloor}$
好吧,对于此题要加一个特判,因为n可能大于k,此时不能直接用原来代码,而i为整数且k<i<=n时${\lfloor}{\frac{k}{i}}{\rfloor}$的值为0,因此跳过即可;还有要"跳"到的j要和n取min
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll n,k,ans;
int main()
{
ll i,j;
scanf("%lld%lld",&n,&k);ans=n*k;
for(i=;i<=min(n,k);i=j+)
{
j=min(n,k/(k/i));//注意对n取min
ans-=(k/i)*(i+j)*(j-i+)/;
}
printf("%lld",ans);
return ;
}
洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块的更多相关文章
- 洛谷 P2261 [CQOI2007]余数求和 解题报告
P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...
- [洛谷P2261] [CQOI2007]余数求和
洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...
- 洛谷P2261 [CQOI2007] 余数求和 [数论分块]
题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...
- 洛谷 P2261 [CQOI2007]余数求和
洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...
- P2261 [CQOI2007]余数求和[整除分块]
题目大意 给出正整数 n 和 k 计算 \(G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ n\) 的值 其中 ...
- 【洛谷P2261】余数求和
题目大意:给定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值. 题解:除法分块思想的应用. \(x\%y=x-y\lfloor {x\over y}\rfloor\),因 ...
- P2261 [CQOI2007]余数求和 (数论)
题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...
- 洛谷 2261 [CQOI2007]余数求和
题目戳这里 一句话题意 求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\) Solution 30分做法: 说实话并不知道怎么办. 60分做法: 很明显直接一遍o( ...
随机推荐
- Appium基于安卓的各种FindElement的控件定位
转自:http://www.2cto.com/kf/201410/340345.html 1. findElementByName 1.1 示例 ? 1 2 el = driver.findEleme ...
- cmd下并行执行appium +maven+Testng test
1: first: open two command wins to start appium: appium -p 4725 -bp 4726 -U EP7333W0UR appium -p 472 ...
- Lily HBase Indexer同步HBase二级索引到Solr丢失数据的问题分析
一.问题描述二.分析步骤2.1 查看日志2.2 修改Solr的硬提交2.3 寻求StackOverFlow帮助2.4 修改了read-row="never"后,丢失部分字段2.5 ...
- CSS3 的10种Loading
昨晚用CSS3实现了几种常见的Loading效果,虽然很简单,但还是分享一下,顺便也当是做做笔记…… 第1种效果: 代码如下: <div class="loading"> ...
- 在Java中如何正确地终止一个线程
1.使用Thread.stop()? 极力不推荐此方式,此函数不安全且已废弃,具体可参考Java API文档 2.设置终止标识,例如: import static java.lang.System.o ...
- js中字符串函数indexOf与search的区别
IndexOf()方法是用来判断一个字符串是否存在于一个更长的字符串中.从长字符串左端到右端来搜索,如果存在该子字符串就返回它所处的位置(即索引).如果在被搜索的字符串没有找到要查找的字符串返回-1. ...
- GUI界面资源
30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音 创造力是指任何一种演示设计i的能力.无论是一个标志,旗帜,广告或一个完整的设计,能够注入的创 ...
- spring mvc带参数重定向
http://blog.csdn.net/jackpk/article/details/19121777/ https://isudox.com/2017/02/16/spring-mvc-redir ...
- !important的用法(IE6 兼容的解决方法)
我们知道,CSS写在不同的地方有不同的优先级, .css文件中的定义 < 元素style中的属性,但是如果使用!important,事情就会变得不一样. 首先,先看下面一段代码: <!DO ...
- YTU 2392: 求各位数字之和
2392: 求各位数字之和 时间限制: 1 Sec 内存限制: 128 MB 提交: 1253 解决: 292 题目描述 编写一个程序,计算任意输入的正整数的各位数字之和.(输入的位数不要超过10 ...