代码如下(排序去重后开始选择是否有加进集合):
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
long long a[100010];
bool vis[100010];
int find(int l,int r,long long k){
while(l<r){
int mid=(l+r)>>1;
if(a[mid]>=k) r=mid;
else l=mid+1;
}
if(a[l]==k) return l;
else return 0;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+n+1);
n=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++){
if(a[i]%k==0){
long long p=a[i]/k;
int q=find(1,i,p);
if(!vis[q]){
vis[i]=1;
ans++;
}
}else{
vis[i]=1;
ans++;
}
}
printf("%d",ans);
return 0;
}