NC19826. 数论之神
描述
输入描述
第一行一个整数T(T≤ 105),表示数据组数。
每组数据第一行两个整数,表示n,k(1≤ n≤ 1018),保证k不会超过不同的数字个数。
输出描述
对于每组数据输出,输出两个整数,表示有多少个不同的数字和这里面第k大的是多少。
示例1
输入:
3 1 1 5 2 67 8
输出:
1 1 3 2 15 8
C++14(g++5.4) 解法, 执行用时: 216ms, 内存消耗: 4364K, 提交时间: 2020-10-16 10:00:12
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main(){ LL n,k,t,ans; cin>>t; while(t--){ cin>>n>>k; LL sq=sqrt(n); cout<<(ans=2*sq-1+(n/sq!=sq))<<" "; if(k<=sq)cout<<n/k<<endl; else cout<<ans-k+1<<endl; } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 278ms, 内存消耗: 2148K, 提交时间: 2020-02-15 14:57:10
#include<bits/stdc++.h> using namespace std; int main(){ int _; cin>>_; while(_--){ long long n,k,q,t; cin>>n>>k; q=sqrt(n); t=q*2-(q==n/q); cout<<t<<' '<<(k<=q?n/k:t-k+1)<<'\n'; } }
Python3(3.5.2) 解法, 执行用时: 1008ms, 内存消耗: 5076K, 提交时间: 2018-10-05 15:40:02
import math for i in range(int(input())): n, k = map(int, input().split()) m = int(math.sqrt(n)) print(m * 2 - (n // m == m), n // k if k <= m else (1 + m * 2 - k - (n // m == m)))