列表

详情


NC19826. 数论之神

描述

终于活成了自己讨厌的样子。

这是她们都还没长大的时候发生的故事。那个时候,栗子米也不需要为了所谓的爱情苦恼。
她们可以在夏日的午后,花大把的时间去研究生活中一些琐碎而有趣的事情,比如数论。
有一天西柚柚问了栗子米一个题,她想知道中有多少不同的数,这些不同的数字里面第k大的是多少。

输入描述

第一行一个整数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)))

上一题