Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你一個無限個點的坐標軸,一個集合BBB,如果存在∣i?j∣=bk|i-j|=b_k∣i?j∣=bk?的話,那么i,ji,ji,j之間就連邊?,F在問你至少要從集合BBB中去掉多少個數才能使得連完邊之后這個圖是二分圖。
n≤2e5,Bi≤1e18n\le2e5,B_i\le1e18n≤2e5,Bi?≤1e18
思路:
首先一個圖是二分圖的條件是不存在奇環,那么假設集合中有兩個數x,yx,yx,y,如果存在兩個正整數a,ba,ba,b使得ax=byax=byax=by且(a+b)mod2=0(a+b)\bmod2=0(a+b)mod2=0的話,那么這兩個數是可以同時存在的。
轉換一下就是(lcm(x,y)x+lcm(x,y)y)mod2=0(\frac{lcm(x,y)}{x}+\frac{lcm(x,y)}{y})\bmod 2=0(xlcm(x,y)?+ylcm(x,y)?)mod2=0的時候才可以,即x+ygcd(x,y)mod2=0\frac{x+y}{gcd(x,y)}\bmod2=0gcd(x,y)x+y?mod2=0。
現在分情況討論一下:
(1)x,y(1)x,y(1)x,y都為奇數,由于只有 奇數?*?奇數===奇數,x+ygcd(x,y)mod2=0\frac{x+y}{gcd(x,y)}\bmod2=0gcd(x,y)x+y?mod2=0顯然成立。
(2)x,y(2)x,y(2)x,y一個奇數一個偶數,這里跟上面同理由于gcd(x,y)gcd(x,y)gcd(x,y)一定為奇數,多了一個 偶數?*?奇數=偶數,x+ygcd(x,y)mod2=1\frac{x+y}{gcd(x,y)}\bmod2=1gcd(x,y)x+y?mod2=1顯然不可以。
(3)x,y(3)x,y(3)x,y都為偶數,這個時候可以將兩個數共同除222消去末尾000,之后轉換成上面兩種情況。
通過上面的規律可以發現,我們按照末尾000的個數來分組即可。
// Problem: D. Alex and Julian // Contest: Codeforces - Codeforces Round #586 (Div. 1 + Div. 2) // URL: https://codeforces.com/contest/1220/problem/D // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #include<random> #include<cassert> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid ((tr[u].l+tr[u].r)>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n; LL a[N]; vector<LL>v[100];int get(LL x) {int id;for(int i=60;i>=0;i--) if(x>>i&1) id=i;return id; }int main() { // ios::sync_with_stdio(false); // cin.tie(0);cin>>n;for(int i=1;i<=n;i++) {scanf("%lld",&a[i]);v[get(a[i])].pb(a[i]);}int id,mx=0;for(int i=0;i<=60;i++) if(v[i].size()>mx) mx=v[i].size(),id=i;printf("%d\n",n-mx);for(int i=0;i<=60;i++) {if(id==i) continue;for(auto x:v[i]) printf("%lld ",x);}return 0; } /* */總結
以上是生活随笔為你收集整理的Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑修好后客户发现5个硬盘被拆掉了4个电
- 下一篇: 一文看懂小米MIUI13了解MIUI13