Dividing(除法分块总结)

传送门
在这里插入图片描述
题意:横纵坐标均有个范围[1,N] [1,K],求在这个范围里满足要求点的数量,要求如下
在这里插入图片描述
画图推点易得,每一列的点数
在这里插入图片描述
利用O根号n除法分块就可以算出答案,最后还要注意第一列多算了n要减掉

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;


inline ll solve(ll n, ll k)//除法分块
{
    ll ans = 0, r;
    for (ll l = 1, r; l <= k; l = r + 1)
    {
        r = n / (n / l);
        ans += (min(r,k) - l + 1) * (n / l);
       // cout << "1" << endl;
        //cout << l << ' ' << r << ' ' << ans << endl;
    }
    /*for (register ll i = 1; i <= k; i = j + 1) {
        j = n / (n / i);
        ans += (min(j, k) - i + 1) * (n / i);
    }*/
   // cout << "*" << endl;
    return ans;
}
int main()
{
    
    ll n, k;
    scanf("%lld%lld", &n, &k);
    
    /*ll ans = (solve(n, min(n, k)) % mod + solve(n - 1, min(n - 1, k)) % mod + k % mod) % mod - n;*/
        ll ans = (solve(n - 1,min(n-1, k)) % mod + solve(n, min(n,k)) % mod + k % mod) % mod-n;

        
        if (ans < 0)ans = mod - abs(ans) % mod;
        
        cout << ans << endl;
    
}

除法分块总结
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值