06網易筆試題_數對
阿新 • • 發佈:2018-11-23
牛牛以前在老師那裡得到了一個正整數數對(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); } }