题意就是 给你一个数p,找满足下列条件的数的个数:
1.D是P的因子;
2.D和P的二进制数至少有一个相同;
所以解题分两步:1、找出p的所有因子(最省时方法)
for(int i=1; i*i<=p; i++)
{
if(d%i==0)
{
//找到一个因子
d/i&&(i*i!=p) //相对应的另一个因子
}
}
2、判断找到的因子是否和P有相同的二进制位
首先把P的二进制数保存,
for(int i=0; p!=0; i++)
{
a[i] = p&1; //相当于a[i]=a%2;
p = p>>1; //右移一位,相当于p=p/2
}
和因子n对应的二进制位比较:
int check(int n)
{
int r;
for(int i=0; n!=0; i++, n=n>>1)
{
r = n&1;
if(r==a[i])
return 1;
}
return 0;
}
已AC代码:
#include <cstdio>
using namespace std;
int a[20];
int check(int n)
{
int r;
for(int i=0; n!=0; i++, n=n>>1)
{
r = n&1;
if(r==a[i])
return 1;
}
return 0;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
long long p, d, cont=0;
scanf("%lld", &p);
d = p;
for(int i=0; p!=0; i++)
{
a[i] = p&1;
p = p>>1;
}
for(int i=1; i*i<=d; i++)
{
if(d%i==0)
{
if(check(i))
cont++;
if(check(d/i)&&(i*i!=d))
cont++;
}
}
printf("%lld\n", cont);
}
return 0;
}