题目:
在不超过n的数中,选出一个集合,使得集合内部元素两两互质,且集合元素总和尽可能大。
分析:
神奇的性质题。
出题人不会证,问了一堆大佬也不会。
哈(那么证明就留给读者来完成)
性质是:
1、每个元素最多只有两个质因子。
2、若有两个质因子,一定有一个大 n \sqrt n n。
有了这两个性质就很水了
把质数分成超过 n \sqrt n n和不超过的部分。
每个质数有两种选择:
1、 质数的整次幂
2、与另一部分的一个质数结合,再求出最大整次幂。
就可以弄成一个二分图来算贡献。
跑费用流的时候要注意,如果当前最大费用为负数就别跑了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 200010
#define INF 0x3FFFFFFF
using namespace std;
typedef long long ll;
ll ans;
int n;
bool isprime[MAXN];
int primes[MAXN],cnt,minp[MAXN];
map<pair<int,int>,int> mp;
void prepare(){
for(int i=2;i<=n;i++){
if(isprime[i]==0){
primes[++cnt]=i;
minp[i]=i;
}
for(int j=1;i*primes[j]<=n;j++){
i