二分查找
(写得有点丑!)
#include<stdio.h>
#include<algorithm>
using namespace std;
long long a[100010],vis[100010];
long long ans,n,k;
void search(long long x)
{
long long l=1,r=n;
while(l<r)
{
if(a[l]==x)
{
if(!vis[l])
{
vis[l]=1;
ans--;
break;
}
}
if(a[r]==x)
{
if(!vis[r])
{
vis[r]=1;
ans--;
break;
}
}
long long mid=(l+r)/2;
if(a[mid]>x)
{
r=mid;
}
else if(a[mid]<x)
{
l=mid;
}
else if(a[mid]==x)
{
if(!vis[mid])
{
vis[mid]=1;
ans--;
break;
}
}
if(l+1==r)break;
}
}
int main()
{
scanf("%I64d%I64d",&n,&k);
for(long long i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
if(k==1&&n>1)
{
printf("%I64d\n",n);
return 0;
}
sort(a+1,a+n+1);
for(long long i=1;i<=n;i++)vis[i]=0;
ans=n;
for(long long i=1;i<=n;i++)
{
if(!vis[i])search(a[i]*k);
}
printf("%I64d\n",ans);
return 0;
}