题意
给
出
(
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 + 2 k , k ) . . . − > ( 1 + x k , k ) 其 中 x 为 非 负 整 数 ( 1 , k ) − > ( k , k ) − > ( 加 法 ) − > ( 2 k , k ) − > . . . − > ( x k , 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 = 1 k = K ( N / k ) + ∑ k = 1 k = 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 < = x 1 k < = N 以 及 1 < = x 2 k + 1 < = N , 求 所 有 x 1 k 以 及 x 2 k 去 重 后 的 个 数
先
不
考
虑
去
重
算
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
先 不 考 虑 去 重 算 x 1 k 的 个 数 , 简 单 直 接 N / k 算 x 2 k 的 个 数 , 化 简 0 < = x 2 k < = 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 = 1 k = K ( N / k ) + ∑ k = 1 k = 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得证
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 得 证 如何计算呢?
考
虑
到
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<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 ;
}