参考:题解

令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. Handler之IdleHandler

    MessageQueue提供了另一类消息,IdleHandler 如果返回false,每次轮询都会调用(理论上应该可以做一些别的东西) Looper.myQueue().addIdleHandler( ...

  2. Finally语句块的运行

    一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验. ...

  3. 记录001:AS11 BAPI

    未知元素(174657434)  15:05:41AS11有没有BAPI呀?有做过的吗 BAPI_FIXEDASSET_OVRTAKE_CREATE

  4. 20170224 SE11删除数据

    目的,批量删除错误条目.1.SE11 通过条件找到目标数据,并选中: 2./H 进入debug,回车,更改值 OK_CODE  =  DEL5 F8 运行则出现删除框,

  5. QT实现FTP服务器(二)

    QClientThread类的实现: #include "QClientThread.h" #include <QDebug> /******************* ...

  6. swt_table 回车可编辑Esc取消

    package 宿舍管理系统; import java.util.Hashtable; import org.eclipse.swt.SWT; import org.eclipse.swt.custo ...

  7. ios 关于动画用法的总结

      #import "FirstVC.h" @implementation FirstVC /*     创建xib过程     1 创建xib(名字和类名相同)     2 文件 ...

  8. NEU 1683: H-Index

    题目描述 Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...

  9. POJ3111 K Best —— 01分数规划 二分法

    题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissio ...

  10. 格式化磁盘,提示 is apparently in use by the system

    一般是被mdadm占用着. 使用  cat /proc/mdstat 查看所有 找到欲格式化盘符号. 使用 mdadm --stop /dev/md0 mdadm --remove /dev/md0 ...