题意
给
出
(
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<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;
}