附上代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,vis[100005],ans;
//vis记录元素是否被使用过了,ans记录答案
long long si[100005];//记录元素
int half(int l,int r,long long num){//二分
if(si[l]==num) return l;
if(si[r]==num) return r;
if(l==r-1) return 0;
int mid=(l+r)/2;
if(si[mid]==num) return mid;
else if(si[mid]<num) return half(mid,r,num);
else return half(l,mid,num);
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i) scanf("%lld",&si[i]);
sort(si+1,si+1+n);
for(int i=1;i<=n;++i){
if(vis[i]) continue;
long long base=si[i],ctt=0;
for(int j=1;;j++){//找连续相差k被的数
int temp=half(i,n,base);//例如2,2k,2k^2……
if(temp){
ctt++;
vis[temp]=1;
}
else break;
base*=k;
if(base<si[i]) break;
}
if(ctt%2==0) ans+=ctt/2;//从连续数列中选取k-集合中的元素
else ans=ans+ctt/2+1;
}
cout<<ans;
}