2017hdu新生赛 1008 友好整数

友好整数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 224    Accepted Submission(s): 54


Problem Description
在成功解决他的数学作业之后,Elly感到很无聊,于是他造了N个大整数。
在这N个整数中,他喜欢某些对整数,但不喜欢另一些。

Elly称他喜欢的那些对整数为友好整数(Pals)。  
两个整数被称为友好整数(Pals)当且仅当这两个数至少有一个数字相同(不一定在同一位置)。

请帮助Elly计算出在他的整数中有多少对友好整数(Pals)。
 

Input
输入包含多组测试用例。

每组数据第一行包含一个整数 N,表示Elly的整数个数。
接下来N行,每行一个整数Ai,每个整数互不相同。

1≤N≤10^6
1≤Ai≤10^18
 

Output
每组数据输出一行,表示Pals的对数。
 

Sample Input
  
  
3 4 20 44 4 32 51 123 282
 

Sample Output
  
  
1 4
 




#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long a[1024];
//状态压缩如 1232 0111000000
//12322222      0111000000
//用long long 存2进制数(0~9),无标0,有标1
int main() {
    int t;
    long long s;
    while (cin>>t) {
        memset(a, 0, sizeof(a));
        for(int i=1;i<=t;i++){
            scanf("%lld",&s);
            int n=0;
            while (s) {//状态压缩
                n|=(1<<(s%10));
                s=s/10;
            }
            a[n]++;
        }
        s=0;
        for(int i=0;i<1024;i++)
        {
            for(int j=i;j<1024;j++){
                if(i==j)//完全相当
                    s+=a[i]*(a[i]-1)/2;
                else if(i&j)//有部分相等
                    s+=a[i]*a[j];
            }
        }
        printf("%lld\n",s);
    }
    // insert code here...
    //std::cout << "Hello, World!\n";
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值