CodeForces 275C k-Multiple Free Set(二分查找)

 k-Multiple Free Set
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

k-multiple free set is a set of integers where there is no pair of integers where one is equal to another integer multiplied by k. That is, there are no two integers x and y(x < y) from the set, such that y = x·k.

You're given a set of n distinct positive integers. Your task is to find the size of it's largest k-multiple free subset.

Input

The first line of the input contains two integers n and k (1 ≤ n ≤ 105, 1 ≤ k ≤ 109). The next line contains a list of n distinct positive integers a1, a2, ..., an(1 ≤ ai ≤ 109).

All the numbers in the lines are separated by single spaces.

Output

On the only line of the output print the size of the largest k-multiple free subset of {a1, a2, ..., an}.

Sample Input

Input
6 2
2 3 6 5 4 10
Output
3

Hint

In the sample input one of the possible maximum 2-multiple free subsets is {4, 5, 6}.

编译器出了问题,还以为代码错了,浪费了那么多时间
给出n和k,然后给出元素个数为n的集合num,现在要从num集合中挑选出尽量多的元素组成新的集合,新的集合的要求是集合中不存在元素x , y(x < y)使得x * k = y,输出最大的元素个数。
想将数字进行排序,然后,从头到尾二分查找,对已查找的进行标记,轮到其实跳过
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std; 
int v[100010];  
long long a[100010];  
int main()  
{  
    int n;  
    long long k;  
    scanf("%d%lld",&n,&k);  
    for(int i=1;i<=n;++i){  
        scanf("%lld",&a[i]);  
    }  
    sort(a+1,a+n+1);  
    memset(v,0,sizeof(v));  
    int ans=n;  
    for(int i=1;i<=n;++i){  
        if(v[i]==1)
		continue;  
        int  left=i+1,right=n;  
        long long temp = a[i]*k;  
        while(left<=right){  
            int mid=(left+right)/2; 
			//printf("%d %d  ",left,right); 
            if(a[mid]==temp){  
                v[mid]=1;
				ans--;
				break;  
            }  
            else if(a[mid]>temp){  
                right=mid-1;  
            }  
            else{  
                left=mid+1;  
            }  
        }  
    }  
    printf("%d\n",ans);   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值