参考:题解

令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. 项目Beta冲刺(团队1/7)

    项目Beta冲刺(团队1/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...

  2. 查看 python安装目录

    打开终端 输入: which python 打开终端 依此输入: python import sys print sys.path

  3. Android经常使用的工具类

    主要介绍总结的Android开发中经常使用的工具类,大部分相同适用于Java. 眼下包含HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Pr ...

  4. mysql创建 存储过程 并通过java程序调用该存储过程

    create table users_ning(id primary key auto_increment,pwd int); insert into users_ning values(id,123 ...

  5. Hibernate中的merge使用详情解说

    merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:                                       当ID在数据库中不能找到时,用up ...

  6. <转载>调制与解调电路详解

    原文链接:http://www.elecfans.com/analog/20120509270848_4.html 调幅和检波电路 广播和无线电通信是利用调制技术把低频声音信号加到高频信号上发射出去的 ...

  7. mini_magick

    https://github.com/minimagick/minimagick class  https://www.rubydoc.info/github/minimagick/minimagic ...

  8. CocoaPods初体验

    之前没用过cocoapods,但是新项目需要用到. 安装cocoapods: 按照官方的: $ sudo gem install cocoapods    // 但是什么都没有发生 升级gem $ s ...

  9. button在firefox 和 ie 下的问题

    最近做了一个关于数据库管理的项目,因为不用考虑ie9以下的兼容性,所以一股脑的写完啦,到测试的时候发现了一个bug IE和火狐下有个模块关闭按钮的hover没有反应,ie不行就算了,火狐怎么也不行?我 ...

  10. WCF寄宿到Windows Service[1]

    WCF寄宿到Windows Service 返回 在前面创建一个简单的WCF程序,我们把WCF的服务寄宿到了Host这个控制台项目中了.下面将介绍如何把WCF的服务寄宿到Windows服务中(源代码) ...