題目大意:把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()
{ios
int T
;cin
>>T
;get_primes(N
);while(T
--){solve();}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(把1到n分为不互质的数对,找最多的对数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。