完全グラフ
タイトル説明
異なる頂点の各対の間だけでも、一側が接続され有し数学の図の理論は、完全グラフは、単純な無向グラフです。---- Baiduの百科事典が
完成しましグラフ含むn個の頂点を与え、あなたはグラフのエッジの一部を削除することができ、エッジは、mは項目を削除超えることができない、といくつかのアップ後に省略側面ビューを尋ねます連結成分?
入力説明:
最初の行の番号Tを含み、試験データの数が設定示す
2つの正の整数の次にTラインをN、M、スペースで中間分離
出力説明:
各整数回答を表し、出力Tラインを
まず/無向完全グラフは、n有し*(N-1)2エッジを知っていなければなりません。
その後、法律を起動することができます。
削除エッジ | 部品の数を伝えます |
---|---|
N-1 | 1 |
N-1 + N-2 | 2 |
N-1 + N 2 + N-3 | 3 |
... | ... |
列挙子は、連結成分の半数は、xすることができ、除去されるエッジの数、及びその後Mの比較を算出します。
しかし、この問題は、代わり__int128 longlongs使用することができるより多くの異常なデータ範囲です。
コード:
#include<bits/stdc++.h>
#define LL unsigned long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=1000100;
const LL mod=100000000;
inline __int128 read(){//输入模板
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void print(__int128 x){//输出模板
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
print(x/10);
putchar(x%10+'0');
}
__int128 n,m;
int judge(__int128 p){
__int128 q=p-1;
__int128 s1=n*q-q*(q+1)/2;
__int128 s2=s1+n-p;
if(m<s1) return 0;
if(s1!=s2&&m>=s1&&m<s2) return 1;
else if(s1==s2&&m>=s1) return 1;
return 2;
}
int main(){
__int128 t=read();
while(t--){
n=read(),m=read();
__int128 l=1,r=n;//二分连通分量
__int128 ans=1;
while(l<=r){
__int128 d=(l+r)/2;
int ok=judge(d);
if(ok==0) r=d-1;
else if(ok==2) l=d+1;
else{
ans=d;
break;
}
}
print(ans);
cout<<endl;
}
return 0;
}