返回顶部

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);
}
posted @ 2020-08-03 08:48  Charles1999  阅读(172)  评论(0编辑  收藏  举报