题目大意
有
t
t
t组数据,每组数据给定一个正整数
n
n
n,你可以使用任意两个数字组成一个二元组,两个二元组不同当且仅当他们之中的元素经过任意位置变换后不能相同时
问你用多少个数可以严格组成
n
n
n个不同的二元组
思路
关键在二元组数量严格为
n
n
n上,一开始我没注意到交了一发组合数直接
w
a
wa
wa掉了…正确思路如下
每个数最多有两个,一个和别的去匹配(贡献最大),一个和自己匹配(贡献为1),我们优先令所有数都是只有一个,也就是找到方案数
>
=
n
>=n
>=n的第一个数
m
m
m,特判一下
=
n
=n
=n直接输出
>
n
>n
>n就让
m
−
1
m-1
m−1,剩下的方案通过添加单个数的另一个数满足
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
int n;
bool check(int x) {
return x * (x - 1) / 2 >= n;
}
void solve()
{
cin >> n;
int le = 0;int ri = 2648956421;
while (le < ri) {
int mid = le + ri >> 1;
if (check(mid))ri = mid;
else le = mid + 1;
}
if (ri * (ri - 1) / 2 == n) {
cout << ri << '\n';
return;
}
ri--;
int m = n - ri * (ri - 1) / 2;
cout << ri + m << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}