[CQOI2007]余数求和
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。
Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
当i>k时,k%i就是k
当i>k时,k%i就是k
ans1=(n-k)*k [n>k]
当i<k时
ans=k%1+k%2+k%3......k%i i属于[1,min(n,k)]
因为k%i=k-[k/i]*i
所以原式=k*min(n,k)-[(k/1)*1+(k/2)*2+.....(k/i)*i]
因为(k/i)在一定的区间内相同,所以可以分块
于是就分成了√n块,每一块都是等差数列
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long lol; 8 lol ans,n,k,pos; 9 int main() 10 {lol i; 11 cin>>n>>k; 12 if (n>k) 13 ans+=(n-k)*k; 14 ans+=min(n,k)*k; 15 for (i=1;i<=min(n,k);i=pos+1) 16 { 17 pos=min(n,k/(k/i)); 18 ans-=(k/i)*(i+pos)*(pos-i+1)/2; 19 } 20 cout<<ans; 21 }