題意:
輸入正整數n和k(1<=n,k<=),計算
分析:
根據紫書,假設k/i的整數部分等於p,則k mod i=k-i*p。於是從i,i+1,i+2,······,j,k除以它們的商的整數部分都相同,則k除以它們的餘數會是一個等差數列。
這樣,可以在枚舉i時把它所在的等差數列之和累加到答案中。這需要計算滿足[k/j]和[k/i]=p的最大j。
當p=0時這樣的j不存在,所以等差數列一直延續到序列的最後。
當p>0時j爲滿足k/j>=p的最大j,即j<=k/p。
注意:當i>k時k mod i = k。即i>k的部分之和爲k*(n-k)。
代碼:
#include<iostream>
using namespace std;
typedef long long ll;
ll ans,n,k;
void f(){
ll i=2,p,t,d,nn;
ans=0;
while(i<k){
if(i>n)
break;
p=k/i;
t=k%i;
d=k/p;
//printf("i:%d p:%d t:%d d:%d ",i,p,t,d);
nn=min(d,n)-i+1;
ans+=nn*t+((k%(i+1)-t)*(nn-1)*nn)/2;
//printf("%d\n",(d-i+1)*t+(k%(i+1)-t)*(d-i));
i=min(d,n)+1;
}
if(n>k){
ans+=k*(n-k);
}
}
int main(){
while(cin>>n>>k){
f();
cout<<ans<<endl;
}
return 0;
}