题目链接

题面:

题意:
( 1 , k ) (1,k) (1,k)是一个符合要求的二元组。
如果 ( n , k ) (n,k) (n,k)是一个符合要求的数组,那么 ( n + k , k ) (n+k,k) (n+k,k)是一个符合要求的数组。
如果 ( n , k ) (n,k) (n,k)是一个符合要求的数组,那么 ( n k , k ) (nk,k) (nk,k)是一个符合要求的数组。

给定 n , k n,k n,k问有多少个符合要求的数组。

题解:
比赛的时候是打表看出来的规律。
对于二元组 ( n , k ) (n,k) (n,k),如果他是一个符合要求的二元组,那么 n = 1 <mtext>   </mtext> m o d <mtext>   </mtext> k n=1\space mod\space k n=1 mod k 或者 n = 0 <mtext>   </mtext> m o d <mtext>   </mtext> k n=0\space mod\space k n=0 mod k

那么 n 1 = 0 <mtext>   </mtext> m o d <mtext>   </mtext> k n-1=0\space mod\space k n1=0 mod k 或者 n = 0 <mtext>   </mtext> m o d <mtext>   </mtext> k n=0\space mod\space k n=0 mod k

那么 a n s = n + k 1 + i = 2 k ( n / i + ( n 1 ) / i ) ans=n+k-1+\sum_{i=2}^k(n/i+(n-1)/i) ans=n+k1+i=2k(n/i+(n1)/i)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#include<list>
#include<ctime>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x) (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
using namespace std;

const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1e9+7;
const double eps=1e-1;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=200100;
const int maxp=400100;
const int maxm=600100;
const int up=200000;


ll fi(ll n,ll up)
{
    ll ans=0;
    for(ll l=2,r;l<=up;l=r+1)
    {
        r=min(n/(n/l),up);
        ans=(ans+n/l%mod*(r-l+1)%mod)%mod;
    }
    return ans;
}

int main(void)
{
    ll n,k;
    ll ans=0;
    scanf("%lld%lld",&n,&k);
    ans=(n+k-1)%mod;
    ans=(ans+fi(n,min(n,k))+fi(n-1,min(n-1,k)))%mod;
    printf("%lld\n",ans);
}