Dividing
题目描述:
以下规则定义了一种整数元组-传奇元组:
- 始终是传奇元组,其中k是整数。
- 如果 是传奇元组,则 也是传奇元组。
- 如果 是传奇元组, 也是传奇元组。
我们想知道传奇元组
的数量,其中
为了避免计算巨大的整数,请输出答案取余
的值。
输入描述:
输入包含两个整数 和 ,
输出描述:
输出答案取模
样例:
样例输入1:
3 3
样例输出1:
8
样例输入2:
3 9
样例输出2:
14
思路:
我们观察题目意思可以发现,只有当
或n是
的倍数或
是
的倍数时,
是传奇元组。
所以,我们只要对于每一个确定的传奇元组
,当且仅当
可以减
或
,最后变成1,于是我们得到了以下两种操作:
- 如果 是 的倍数,即 ,那么就可以减掉 个 ,将 变为 ,再 变为 .
- 如果 是 的倍数, ,那么就减掉 个 。
因为 和 中总有一个数小于 ,所以另一个数可以直接通过计算获取。
:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
ll n,k,ans;
void f(ll n){
for(ll i=2,j;i<=n&&i<=k;i=j+1){
j=min(n/(n/i),k);
ans=(ans+(j-i+1)%mod*(n/i)%mod)%mod;
}
}int main(){
scanf("%lld%lld",&n,&k);
f(n);
f(n-1);
printf("%lld\n",(ans+n+k-1)%mod);
}