原题
题目描述
定义传奇元组
●
始终是传奇元组,其中k是整数。
● 如果
是传奇元组,
与
也是传奇元组。
我们想知道
,
时传奇元组
的数目。
输入描述
输入包含两个整数
和
,
,
12。
输出描述
输出答案,取模
9
。
样例1
输入
3 3
输出
8
样例2
输入
3 9
输出
14
思路
一拍脑袋,我们会知道由
推出的
的传奇元组,
必定是
的倍数;而如果没有, 那么肯定是
的形式。
所以只有在满足
,
是
的倍数,或者
是
的倍数时,
是传奇元组。
- 若 ,则 和 中肯定有一个数字不超过 6,所以只要枚举 和 中较小的数字即可,另外一个的个数可以通过计算得出。
- 若 ,则和上面的情况相同。
- 若
,直接统计即可。
具体细节可以看以下代码。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll n,m,sum;
void solve(ll a,ll b)
{
b=min(a,b);
for (ll l=2,r;l<=b;l=r+1)r=min(b,(a/(a/l))),sum=(sum+(r-l+1)%mod*(a/l));
}
int main()
{
scanf("%lld%lld",&n,&m);
solve(n,m);solve(n-1,m);
printf("%lld",((sum+n)%mod+m-1)%mod);
return 0;
}