牛客国庆集训派对Day5 L.数论之神

牛客国庆集训派对Day5 L.数论之神

传送门

题解:
根据分块,我们可以知道, x = s q r t ( n ) x=sqrt(n) x=sqrt(n) x ∗ ( x + 1 ) = = n x*(x+1)==n x(x+1)==n的时候一共有 2 ∗ s q r t ( n ) 2*sqrt(n) 2sqrt(n)个不同的数,不然有 2 ∗ s q r t ( n ) − 1 2*sqrt(n)-1 2sqrt(n)1个数。然后就是第k的的数是多少的问题。令 r e s = 2 ∗ s q r t ( n ) 或 r e s = 2 ∗ s q r t ( n ) − 1 res=2*sqrt(n)或res=2*sqrt(n)-1 res=2sqrt(n)res=2sqrt(n)1当k>=x的时候答案就是 r e s − k + 1 , 否 则 就 是 n / k res-k+1,否则就是n/k resk+1,n/k

#include
#define int long long
using namespace std;
signed main()
{
    int t;  cin>>t;
    while(t--){
        int n,k; cin>>n>>k;
        int x=sqrt(n);
        int res=2*sqrt(n)-1;
        if(x*(x+1)==n) res++;
        cout<<res<<' ';
        if(k>=x) cout<<res-k+1<<endl;
        else cout<<n/k<<endl;
    }
}

你可能感兴趣的:(数学)