友好整数
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
#include
#include
#include
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;
}