2020牛客暑期多校训练营(第七场)H-Dividing(数论分块)
作者:互联网
题目链接
找找规律就能看出来最后元组的结果在\(k\)任意取的条件下,\(n\)只要满足\(n\%k=0\)或者\(n\%k=1\)即可。那求的就是\(\sum\limits_{i=1}^{k}{\lfloor \frac{N}{k} \rfloor}+\sum\limits_{i=1}^{k}{\lfloor \frac{N-1}{k} \rfloor}\)。数论分块处理一下就行了。写代码的时候注意考虑\(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\n",ans);
}
标签:lfloor,frac,Dividing,int,ll,第七场,多校,rfloor,long 来源: https://www.cnblogs.com/charles1999/p/13424380.html