洛谷 P1978 集合

来源:互联网 发布:r混合编程 epub 编辑:程序博客网 时间:2024/06/18 14:24

题目:

给定一个集合,选集合中的一些数,使它们乘以 k 之后的数都不在这个集合内

给你一个由 n 个不同的数组成的集合,请你从这个集合中找出一个最大的 k-集合。

题解

由于考虑到肯能超long long的情况,从大到小排序,对于每一个没被标记数x二分寻找x1/k是否存在,存在则标记。

程序

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<algorithm>#include<functional>#define LL long longusing namespace std;int n,ans,m;LL a[100005];int b[100005];int fen(int f,int b,LL num){    int m;    while(f<b){        m=(f+b)>>1;        if(a[m]<num) b=m-1;        else if(a[m]>num) f=m+1;        else return m;    }    return f;}bool cmp(LL x,LL y){    return x>y;}int main(){    freopen("set.in","r",stdin);    freopen("set.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%lld",&a[i]);    }    sort(a+1,a+n+1,cmp);    for(int i=1;i<=n;i++){        if(!b[i]){            ans++;            if(a[i]%m==0){                int place=fen(1,n,a[i]/m);                if(a[place]*m==a[i]) b[place]=1;            }        }    }    printf("%d",ans);    return 0;}