CCPC2019河南省賽~~ 2523 咕咕的計數題 II

題目描述:

咕咕最近在學習初等數論,並且對下取整函數產生了極大的興趣。下取整函數是指一個函數,自變量爲 一個實數,因變量爲一個整數,這個整數恰好是小於或等於自變量的最大的整數,通常記做 ⌊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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章