题目链接
找找规律就能看出来最后元组的结果在(k)任意取的条件下,(n)只要满足(n\%k=0)或者(n\%k=1)即可。那求的就是(sumlimits_{i=1}^{k}{lfloor frac{N}{k} floor}+sumlimits_{i=1}^{k}{lfloor frac{N-1}{k} floor})。数论分块处理一下就行了。写代码的时候注意考虑(k=1)时的重复计算。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main(){
ll n,k,ans=0;
cin>>n>>k;
for(ll l=1,r,p;l<=min(n,k);l=r+1){
p=n/l;
r=min(k,n/p);
ans=(ans+(r-l+1)%mod*p%mod)%mod;
}
n--;
for(ll l=2,r,p;l<=min(n,k);l=r+1){
p=n/l;
r=min(k,n/p);
ans=(ans+(r-l+1)%mod*p%mod)%mod;
}
ans=(ans+k-1)%mod;
printf("%lld
",ans);
}