題目描述:
咕咕最近在學習初等數論,並且對下取整函數產生了極大的興趣。下取整函數是指一個函數,自變量爲 一個實數,因變量爲一個整數,這個整數恰好是小於或等於自變量的最大的整數,通常記做 ⌊x⌋。例如, ⌊2.5⌋ = 2,⌊2⌋ = 2,⌊−2.5⌋ = −3。
咕咕發現,給定一個 a,並不是所有的自然數 n 都存在一個正整數 i 使得 ⌊n/i⌋ = a。那麼,如果給定 l,r,咕咕好奇在區間 [l,r] 中有多少個正整數能使這個等式有正整數解 i 呢?
那麼,聰明的你,你能告訴咕咕嗎?
輸入
第一行有一個整數 T(1 ≤ T ≤ 106),表示數據組數。接下來有 T 行,每行有三個數 a,l,r(1 ≤ a ≤ 1018,1 ≤ l ≤ r ≤ 1018),表示一組詢問。
輸出
輸出 T 行,對每組詢問,輸出一個整數表示答案。
樣例輸入 Copy
4
5 7 10
7 39 42
1000 1000 1000
27 100 1000
樣例輸出 Copy
1
2
1
617
思路:首先將n進行分解,n=ai+j(0 <= j <a),但若想使 a=⌊(ai+j)/i⌋ 成立j需要滿足 0 <= j < i,且當i>=a時 所有的j都成立,當i<a時 只有i個j成立。
然後我們對區間兩端點分別求值相減即可。
#include<bits/stdc++.h>
using namespace std;
long long f(long long a, long long x) {
long long t = x / a;
if (t >= a) return x-(a-1)*(a+2)/2; // (a-1) + (a-1)*a/2 分別是i=0和i>0時不滿足條件的n的個數
return (t-1)*t/2 + min(t, x-a*t+1); // 直接算滿足條件的n的個數
}
int main() {
int T; scanf("%d", &T);
while(T --) {
long long a, l, r;
scanf("%lld%lld%lld", &a, &l, &r);
printf("%lld\n", f(a,r) - f(a,l-1));
}
return 0;
}