[CQOI2007]余数求和
题目描述
给出正整数 n n n 和 k k k,请计算
G ( n , k ) = ∑ i = 1 n k m o d i G(n, k) = \sum_{i = 1}^n k \bmod i G(n,k)=i=1∑nkmodi
其中 k m o d i k\bmod i kmodi 表示 k k k 除以 i i i 的余数。
输入格式
输入只有一行两个整数,分别表示 n n n 和 k k k。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
10 5
样例输出 #1
29
提示
样例 1 解释
G ( 10 , 5 ) = 0 + 1 + 2 + 1 + 0 + 5 + 5 + 5 + 5 + 5 = 29 G(10, 5)=0+1+2+1+0+5+5+5+5+5=29 G(10,5)=0+1+2+1+0+5+5+5+5+5=29。
数据规模与约定
- 对于 30 % 30\% 30% 的数据,保证 n , k ≤ 1 0 3 n , k \leq 10^3 n,k≤103。
- 对于 60 % 60\% 60% 的数据,保证 n , k ≤ 1 0 6 n, k \leq 10^6 n,k≤106。
- 对于 100 % 100\% 100% 的数据,保证 1 ≤ n , k ≤ 1 0 9 1 \leq n, k \leq 10^9 1≤n,k≤109。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e6;
LL n,k;
int main(){
cin >> n >> k;
LL ans = n * k;
for(int l = 1,r;l <= n;l = r + 1)
{
if(k/l != 0)
r = min(k/(k/l),n);
else
r = n;
ans -= (k / l) * (l + r) * (r - l + 1)/2;
}
cout << ans << endl;
system("pause");
return 0;
}