1. 程式人生 > >網易2019實習生招聘筆試-數對

網易2019實習生招聘筆試-數對

牛牛以前在老師那裡得到了一個正整數數對(x, y), 牛牛忘記他們具體是多少了。

但是牛牛記得老師告訴過他x和y均不大於n, 並且x除以y的餘數大於等於k。

牛牛希望你能幫他計算一共有多少個可能的數對。


輸入描述:
輸入包括兩個正整數n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。


輸出描述:
對於每個測試用例, 輸出一個正整數表示可能的數對數量。

列舉每一個除數y,對於除數y來說,餘數為0-y-1的長度為y的迴圈節 因此迴圈部分有n/y*(y-k)個數對(對於被除數小於除數的情況下,有y-k個數對),非迴圈部分為n%y-k+1個數對,

最後考慮k=0的情況,很明顯是n*n個數對

#include <iostream>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstdlib>
#define LL long long
using namespace std;
LL n,k,s;
int main(){
    LL count=0;
    cin>>n>>k;
    if(k==0){
        count=n*n;
    }
    else{
        for(LL i=k+1;i<=n;i++){
        //count+=n-i;
            s=n/i;
            count+=s*(i-k);
            LL m = n%i;
            if(m>=k){
                count+=m-k+1;
            }
        }
    }

    cout<<count<<endl;
    return 0;
}