1. 程式人生 > >06網易筆試題_數對

06網易筆試題_數對

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

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

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

輸入描述:

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

輸出描述:

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

輸入例子1:

5 2

輸出例子1:

7

例子說明1:

滿足條件的數對有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)

思路:

1、餘數>=k,則 除數y肯定>k,所以從y=k+1開始掃描

2、對於除數i,除以任何數,餘數肯定在0~(y-1)中,共i個,所以餘數迴圈共有[n/i]組迴圈

3、每組迴圈中有(y-1)-k+1=y-k個餘數大於k

注意:當k=0時:最後餘下的不成組的餘數(  共n-(y-k)*(n/i) 個 )都>=k,不包括上一組的最後一個;

當k!=0時,最後餘下的不成組的餘數中 只有(n-(y-k)*(n/y) +1個 )>=k ,為什麼要 +1? 因為>=k中的“=”號。

package Practise;

import java.util.Scanner;

public class Main4 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        long flag = 0;
        for(int y = k+1 ;y <= n ; y ++){
            flag = flag+ (n/y)*(y-k);
            if((n/y)*y+k<=n){
                //當k!=0時,最後餘下的不成組的餘數中 只有(n-(y-k)*(n/y) +1個 )>=k ,
                if(k!=0)
                    flag =flag+(n -( (n/y)*y + k )+1);
                //當k=0時:最後餘下的不成組的餘數(共n-(y-k)*(n/i)個)都>=k,不包括上一組的最後一個;
                else
                    flag =flag +(n -( (n/y)*y + k ));
            }
        }
        System.out.println(flag);
    }
}