2020牛客多校第七场 Dividing

题意
给 出 ( n , k ) 是 A 的 要 求 , 问 n 属 于 1 到 N 以 及 k 属 于 1 到 K 中 有 多 少 种 组 合 ? 给出(n,k)是A的要求,问n属于1到N以及k属于1到K中\\有多少种组合? (n,k)An1Nk1K?
思路
思 路 是 队 友 想 出 来 的 , 现 在 回 头 看 这 题 , 确 实 也 是 比 较 显 然 的 对 于 每 一 个 k , 我 们 考 虑 由 这 个 k 可 以 拓 展 的 所 有 组 合 ( 1 , k ) − > ( 1 + k , k ) − > ( 1 + 2 k , k ) . . . − > ( 1 + x k , k ) 其 中 x 为 非 负 整 数 ( 1 , k ) − > ( k , k ) − > ( 加 法 ) − > ( 2 k , k ) − > . . . − > ( x k , k ) 其 中 x 为 正 整 数 思路是队友想出来的,现在回头看这题,确实也是比较显然的\\对于每一个k,我们考虑由这个k可以拓展的所有组合\\(1,k)->(1+k,k)->(1+2k,k)...->(1+xk,k)\\其中x为非负整数\\(1,k)->(k,k)->(加法)->(2k,k)->...->(xk,k)\\其中x为正整数 k,k(1,k)>(1+k,k)>(1+2k,k)...>(1+xk,k)x(1,k)>(k,k)>()>(2k,k)>...>(xk,k)x
问题转化(注意/表示下取整)
求 解 ∑ k = 1 k = K ( N / k ) + ∑ k = 1 k = K ( N / k ) + K − N 求解\sum_{k=1}^{k=K}(N/k)+\sum_{k=1}^{k=K}(N/k)+K-N k=1k=K(N/k)+k=1k=K(N/k)+KN
解 释 : 1 < = x 1 k < = N 以 及 1 < = x 2 k + 1 < = N , 求 所 有 x 1 k 以 及 x 2 k 去 重 后 的 个 数 解释:1<=x_1k<=N以及1<=x_2k+1<=N,求所有\\x_1k以及x_2k去重后的个数 1<=x1k<=N1<=x2k+1<=N,x1kx2k
先 不 考 虑 去 重 算 x 1 k 的 个 数 , 简 单 直 接 N / k 算 x 2 k 的 个 数 , 化 简 0 < = x 2 k < = N − 1 , 因 此 数 目 等 于 1 + ( N − 1 ) / k 先不考虑去重\\算x_1k的个数,简单直接N/k\\算x_2k的个数,化简0<=x_2k<=N-1,因此数目等于\\1+(N-1)/k x1kN/kx2k0<=x2k<=N11+(N1)/k
因 此 总 数 ( 未 去 重 ) = ∑ k = 1 k = K ( N / k ) + ∑ k = 1 k = K ( N / k ) + K 因此总数(未去重)=\sum_{k=1}^{k=K}(N/k)+\sum_{k=1}^{k=K}(N/k)+K =k=1k=K(N/k)+k=1k=K(N/k)+K
考 虑 重 复 情 况 考虑重复情况
x k = y k + 1 即 ( x − y ) k = 1 推 出 k = 1 时 才 可 能 有 重 复 , 所 以 对 于 k = 1 考 虑 , 发 现 x k = x 表 示 的 范 围 为 [ 1 , N ] x k + 1 = x + 1 表 示 的 范 围 [ 1 , N ] 推 知 重 复 数 = N a n s = ∑ k = 1 k = K ( N / k ) + ∑ k = 1 k = K ( N / k ) + K − N 得 证 xk=yk+1即(x-y)k=1\\推出k=1时才可能有重复,所以对于k=1考虑,发现\\xk=x表示的范围为[1,N]\\xk+1=x+1表示的范围[1,N]\\推知重复数=N\\ans=\sum_{k=1}^{k=K}(N/k)+\sum_{k=1}^{k=K}(N/k)+K-N得证 xk=yk+1(xy)k=1k=1k=1xk=x[1,N]xk+1=x+1[1,N]=Nans=k=1k=K(N/k)+k=1k=K(N/k)+KN
如何计算呢?
考 虑 到 k 范 围 比 较 大 , 直 接 整 除 分 块 即 可 , 套 套 板 子 就 过 了 比 赛 时 遇 到 一 个 笑 话 , K 与 N 不 相 等 可 以 直 接 套 板 子 吗 ? 可 以 呀 ! 如 果 K > N , 那 么 算 到 N 肯 定 结 束 , 因 为 N / 比 N 大 的 数 = 0 考虑到k范围比较大,直接整除分块即可,套套板子就过了\\比赛时遇到一个笑话,K与N不相等可以直接套板子吗?\\可以呀!\\如果K>N,那么算到N肯定结束,因为N/比N大的数=0 kKN!K>NNN/N=0
如 果 K < N 的 话 , 直 接 截 断 。 如果K<N的话,直接截断。 K<N

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const long long MOD = 1e9+7;
long long getans(long long K, long long N){
    long long ans = 0;
    for(long long l = 1, r ; l <= N; l = r+1){
        r = N/(N/l);
        r = min(r , K);
        ans = (ans + ((r-l+1) % MOD * (N/l) % MOD) % MOD)%MOD;
        if(r == K) break;
    }
    return ans;
}
long long K, N;
int main(){
    scanf("%lld %lld", &N, &K);
    long long ans = ((getans(K , N) + getans(K , N-1)) % MOD + K)%MOD;
    ans = ans - N;
    while(ans < 0)
        ans += MOD;
    ans %= MOD;
    printf("%lld\n", ans);
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值