ZCMU1543 Numbers

来源:互联网 发布:网络征婚成功率 编辑:程序博客网 时间:2024/05/23 21:16

       题意就是 给你一个数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;}




 

 

0 0