题目描述
给出正整数n和k,请计算
G(n,k)= ∑(i=1->i=n) k mod i
其中k mod i表示k除以i的余数。
输入格式
输入只有一行两个整数,分别表示n和k。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1复制
10 5
输出 #1复制
29
说明/提示
样例 1 解释
G(10,5)=0+1+2+1+0+5+5+5+5+5=29。
数据规模与约定
对于?30%?的数据,保证 n,k≤10^3。
对于?60%?的数据,保证 n,k≤10^6。
对于?100%?的数据,保证 1≤n,k≤10^9。
由 k mod i -> x
so
分块后
由于 每块的 [k/i] 相同,so i 用等差数列的 Sn=n*(a1+an)/2 计算,最后乘个[k/i] 即可;
注意 ;
warning !
1:(k/l)在l>k时可能为0,so 为0,break;
2:由l推出来的 r 可能 > n,so r>n时,r=n;
cpp
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define endl '\n'
#define lowbit(x) ((x)&-(x))
const int mod=998244353;
typedef long long ll;
ll ans=0,n1,m1;
ll t,s1,s2,s3,s4,max1=0,min1=100000000,sum=0,n,m,i,j,k,l,r;
ll u[200005],w,v[200005];
inline int read() {
bool sym=0;
int res=0;
char ch=getchar();
while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
return sym ? -res : res;
}
void print(int x) {
if(!x)return;
print(x/10);
putchar(x%10+'0');
}
int isPrime(int n) {
float n_sqrt;
if(n==1) return 0;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5; i<=n_sqrt; i+=6) {
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
/*ll cal(ll n) {
ll res = 0;
for(ll l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
res += n / l *(r-l+1)+ (l+r) * (r - l + 1)/2 ;// 等差数列 求和
}
return res;
}*/
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
s1=n*k;
for(l=1; l<=n; l=r+1) {
if((k/l)<=0)
break;//特判2
r=k/(k/l);
if(r>n)
r=n;//特判1
ans+=(k/l)*(l+r)*(r-l+1)/2;
}
cout <<s1-ans<< endl;
return 0;
}
//mio lover