题意
给 出 ( n , k ) 是 A 的 要 求 , 问 n 属 于 1 到 N 以 及 k 属 于 1 到 K 中 有 多 少 种 组 合 ? 给出(n,k)是A的要求,问n属于1到N以及k属于1到K中\\有多少种组合? 给出(n,k)是A的要求,问n属于1到N以及k属于1到K中有多少种组合?
思路
思 路 是 队 友 想 出 来 的 , 现 在 回 头 看 这 题 , 确 实 也 是 比 较 显 然 的 对 于 每 一 个 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)+K−N
解 释 : 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<=N以及1<=x2k+1<=N,求所有x1k以及x2k去重后的个数
先 不 考 虑 去 重 算 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 先不考虑去重算x1k的个数,简单直接N/k算x2k的个数,化简0<=x2k<=N−1,因此数目等于1+(N−1)/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即(x−y)k=1推出k=1时才可能有重复,所以对于k=1考虑,发现xk=x表示的范围为[1,N]xk+1=x+1表示的范围[1,N]推知重复数=Nans=∑k=1k=K(N/k)+∑k=1k=K(N/k)+K−N得证
如何计算呢?
考 虑 到 k 范 围 比 较 大 , 直 接 整 除 分 块 即 可 , 套 套 板 子 就 过 了 比 赛 时 遇 到 一 个 笑 话 , K 与 N 不 相 等 可 以 直 接 套 板 子 吗 ? 可 以 呀 ! 如 果 K > N , 那 么 算 到 N 肯 定 结 束 , 因 为 N / 比 N 大 的 数 = 0 考虑到k范围比较大,直接整除分块即可,套套板子就过了\\比赛时遇到一个笑话,K与N不相等可以直接套板子吗?\\可以呀!\\如果K>N,那么算到N肯定结束,因为N/比N大的数=0 考虑到k范围比较大,直接整除分块即可,套套板子就过了比赛时遇到一个笑话,K与N不相等可以直接套板子吗?可以呀!如果K>N,那么算到N肯定结束,因为N/比N大的数=0
如 果 K < N 的 话 , 直 接 截 断 。 如果K
#include
#include
#include
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;
}