bzoj1257[CQOI2007]余数之和(除法分块)
1257: [CQOI2007]余数之和
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 6117 Solved: 2949
[Submit][Status][Discuss]
Description
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值
其中k mod i表示k除以i的余数。
例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7
Input
输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9
Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
HINT
Source
/* 除法分块 Σk%i=Σ(k-i*[k/i])=nk-Σ(i*[k/i]) 令[k/i]=t;对于每一段相同的t,计算左右端点更细答案。 设当前块大小为len Σ(i*t)=t*Σi= t*(len+(len-1)*len/2) */ #include<bits/stdc++.h> #define ll long long using namespace std; ll n,k,ans; ll min(ll x,ll y){return x<y?x:y;} int main() { scanf("%lld%lld",&n,&k); ans=n*k; for (long long l=1,r,t;l<=n;l=r+1) { t=k/l; if (t==0) r=n; else r=min(k/t,n); ll len=(r-l+1); ans-=t*(len*l+(len-1)*len/2); } cout<<ans<<endl; }
折花枝,恨花枝,准拟花开人共卮,开时人去时。
怕相思,已相思,轮到相思没处辞,眉间露一丝。