日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(把1到n分为不互质的数对,找最多的对数)

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(把1到n分为不互质的数对,找最多的对数) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



題目大意:把1到n分為不互質(zhì)的數(shù)對,找最多的對數(shù)

思路:先從最大的質(zhì)因數(shù)開始找,因?yàn)樾〉谋却蟮母菀灼ヅ?#xff0c;所以貪心的從大的開始找。
首先要預(yù)處理出所以數(shù)的最大質(zhì)因數(shù)。
然后根據(jù)質(zhì)因數(shù)從大往小找,當(dāng)質(zhì)因數(shù)大于n/2的時(shí)候 就找不到 配對了。
估計(jì)是偶數(shù) 直接配對,如果是奇數(shù) 講2*p留出來,這樣留到最后,這些數(shù)必定有2的公因子。
代碼:

#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #include <bitset> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se secondusing namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; const ll mod=1e9+7; const ll N =2e5+10; const double eps = 1e-4; const double pi=acos(-1); int gcd(int a,int b){return !b?a:gcd(b,a%b);}int x[4]= {-1,0,1,0}, dy[4] = {0,1,0,-1}; int st[N];vector<int> p[N]; int c[N]; int mx[N]; int r[N]; int idx=0; int k[N]; int id; void get_primes(int n) {st[1]=1;for (int i = 2; i <= n; i ++ ){if (!st[i]){mx[i]=i;for(int j=i+i;j<=n;j+=i){st[j]=1;mx[j]=i;}}} }void solve() {idx=0;int n;cin>>n;for(int i=2;i<=n;i++){if(!st[i]&&2*i>n) continue;p[mx[i]].push_back(i);}vector<pii> a;for(int i=n;i>=2;--i){int le=p[i].size();if(le%2==1){id=0;r[idx++]=i*2;for(int j=0;j<le;j++) if(p[i][j]!=2*i) k[id++]=p[i][j];for(int j=0;j<id;j+=2) a.push_back({k[j],k[j+1]});}else{for(int j=0;j<le;j+=2) a.push_back({p[i][j],p[i][j+1]});}}for(int i=0;i+1<idx;i+=2) a.push_back({r[i],r[i+1]});cout<<a.size()<<endl;for(pii &v:a){cout<<v.fi<<" "<<v.se<<endl;}for(int i=1;i<=n;i++) p[i].clear(); }int main() {iosint T;cin>>T;get_primes(N);//T=1;while(T--){solve();}return 0; }

總結(jié)

以上是生活随笔為你收集整理的2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(把1到n分为不互质的数对,找最多的对数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。