参考:题解

令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]余数求和 ||整除(数论)分块的更多相关文章

  1. 洛谷 P2261 [CQOI2007]余数求和 解题报告

    P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...

  2. 洛谷——P2261 [CQOI2007]余数求和

    P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...

  3. [洛谷P2261] [CQOI2007]余数求和

    洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...

  4. 洛谷P2261 [CQOI2007] 余数求和 [数论分块]

    题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...

  5. 洛谷 P2261 [CQOI2007]余数求和

    洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...

  6. P2261 [CQOI2007]余数求和[整除分块]

    题目大意 给出正整数 n 和 k 计算 \(G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ n\) 的值 其中 ...

  7. 【洛谷P2261】余数求和

    题目大意:给定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值. 题解:除法分块思想的应用. \(x\%y=x-y\lfloor {x\over y}\rfloor\),因 ...

  8. P2261 [CQOI2007]余数求和 (数论)

    题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...

  9. 洛谷 2261 [CQOI2007]余数求和

    题目戳这里 一句话题意 求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\) Solution 30分做法: 说实话并不知道怎么办. 60分做法: 很明显直接一遍o( ...

随机推荐

  1. 安卓动态逆向分析工具--Andbug&Androguard

    工具使用方法: 转自: http://bbs.pediy.com/showthread.php?t=183412 https://testerhome.com/topics/3542 安装andbug ...

  2. 牛客练习赛42 E.热爆了

    这可能是全场最长的一份代码 问的其实是对于关键点的斯坦纳树大小 考虑补集转化,不合法的点就是它的子树中没有关键点的点和斯坦纳树根的祖先 树根不难求,关键点中dfs序最大最小点的LCA就是了 问题在前者 ...

  3. dedecms时间格式调用标签汇总

    1.时间格式{dede:field name='pubdate' function='strftime("%Y年%m月%d日 %H:%M:%S","@me")' ...

  4. 为什么越来越多公链项目将WASM拥入怀中?

    最近越来越多的项目开始转向VNT使用的WASM,像EOS.Ontology,包括最初引入虚拟机EVM运行智能合约环境的以太坊,最近也开始转向使用WASM. 什么是WASM? WASM ,全称:WebA ...

  5. codeforces 691B B. s-palindrome(水题)

    题目链接: B. s-palindrome 题意: 问给定的字符串是否是镜面对称; 思路: 直接看哪些字母是镜面对称的就行: AC代码: //#include <bits/stdc++.h> ...

  6. BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集

    BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集 Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的 ...

  7. 【POJ 3468】 A Simple Problem with Integers

    [题目链接] 点击打开链接 [算法] 本题用线段树很容易写,但是,笔者为了练习树状数组,就用树状数组的方法做了一遍 我们不妨引入差分数组c, 则sum(n) = c[1] + (c[1] + c[2] ...

  8. HTTP node静态资源请求加载demo

    MIME type的缩写为(Multipurpose Internet Mail Extensions)代表互联网媒体类型(Internet media type),MIME使用一个简单的字符串组成, ...

  9. B. Spider Man

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  10. Programming With Objective-C---- Encapsulating Data ---- Objective-C 学习(三) 封装数据

      Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in t ...