除法分块
除法分块 是指使用分块计算的方法求S=i=1∑n⌊ik⌋的值。
举个例子。当 n=20 时,有
| i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
… |
| ⌊i20⌋ |
20 |
10 |
6 |
5 |
4 |
3 |
2 |
2 |
2 |
2 |
1 |
1 |
… |
我们可以把 ∀i∈[1,n] 分成若干块,使得每块的 ∀i 除 n 的值向下取整后相等。
∴S=20+10+6+5+4+3+2×4+1×10。
给出正整数 n 和 k 计算 G(n,k)=k mod 1+k mod 2+k mod 3+⋯+k mod n的值。
输入格式
两个整数 n,k。
输出格式
答案。
输入样例
10 5
输出样例
29
说明
对于 30% 的数据,有 n,k≤1000;
对于 60% 的数据,有 n,k≤106;
对于 100% 的数据,有 n,k≤109。
Solution 2261
根据定义,有 kmodn=k−n×⌊nk⌋
依题意得G(n,k)=i=1∑n(kmodi)=i=1∑n(k−i×⌊ik⌋)=nk−i=1∑n(i×⌊ik⌋)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,k;
int main(){
scanf("%lld%lld",&n,&k);
ll ans=n*k,r;
for(ll l=1;l<=n;l=r+1){
if(k/l) r=min(n,k/(k/l));
else r=n;
ans-=(r-l+1)*(k/l)*(l+r)/2;
}
printf("%lld",ans);
}