题目大意
定义传奇元组:
● (1,k)始终是传奇元组。
● 如果(n,k)是传奇元组,(n+k,k)与(nk,k)也是传奇元组。
我们想知道1≤n≤N,1≤k≤K时传奇元组(n,k)的数目。答案取模10^9+7。
解题思路
官方题解的思路写的很清晰(出题人宁太棒了)
通过题目条件,可以发现:一旦通过(n,k)->(nk,k)的操作来推出新的元组, n必定是k的倍数;而如果没有, 那么肯定是(xk+1,k)的形式。
所以,推出第一条结论:只有在满足n=1,n是k的倍数,或者n-1是k的倍数时,(n,k)是传奇元组。
因此,我们可以认为(n,k)是传奇元组,当且仅当n可以-k或/k,最后变成1。得到以下两种操作:
- 如果n是k的倍数,即n=xk,那么可以减掉(x-1)个k,将n变为k,再/k为1。
- 而如果n-1是k的倍数,即n=xk+1,那么x次除k就行。
详细做法参考官方题解:
AC代码
#include<bits/stdc++.h> using namespace std; const long long mod=1e9+7; long long n,k,ans; void find(long long n) { long long i,j; for(i=2;i<=n && i<=k;i=j+1) { j=min(n/(n/i),k); (ans+=(j-i+1)%mod*(n/i)%mod)%=mod; } } int main() { scanf("%lld%lld",&n,&k); find(n);find(n-1); printf("%lld\n",(ans+n+k-1)%mod); return 0; }