[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
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 }

 

posted @ 2018-01-04 21:29  Z-Y-Y-S  阅读(292)  评论(0编辑  收藏  举报