轻院校赛-zzuli 2266: number【用每位的二进制的幂的和来进行hash(映射)处理】

zzuli 2266: number

大致题意:
 
给定n,问有多少数对<x, y>满足:
x, y∈[1, n], x < y
           x, y中出现的[0, 9]的数码种类相同
输入
一个整数n (n <= 107)
输出
输出一个数即答案
样例输入          
30 
样例输出        
  3

大致思路:

  N的值其实也不是很大,可以考虑跑一次循环把每个值全部分离一次,然后将用二进制上的第0-第9位的‘1’来表示数码0-9,并且要用数组进行标记防止加了两次!
 
  至于hash2 同样因为2^10也就1204,其实开到1000就够了!
 
  在hash2中1--1000每个数字都代表一种种类!
 
  求得是两个同种类型的组合,n个同类数可以构成n*(n-1)种不重不漏的组合!

 


AC 题解:

 1 #define N 2005
 2 
 3 int main(){
 4     int n;
 5     int hash2[2001];
 6 
 7     while(scanf("%d",&n)!=EOF){
 8         memset(hash2,0,sizeof(hash2));
 9         for(int i=1;i<=n;i++){
10             int x=i;
11 
12             int vis[10]={0};
13             int val=0;
14             while(x>0){
15                 int y=x%10;
16                 if(!vis[y]){
17                     val+= 1<<y;
18                     vis[y]=1;
19                 }
20                 x/=10;
21             }
22             hash2[val]++;
23         }
24 
25         ll ans=0;
26         for(int i=1;i<=2000;i++){
27             if(hash2[i]>=2){
28               //  printf("%d %d
",i,hash2[i]);
29                 ans+=(ll)hash2[i]*(ll)(hash2[i]-1)/(ll)2;
30             }
31 
32         }
33         printf("%lld
",ans);
34 
35     }
36 
37     return 0;
38 }
View Code(头文件都私奔去了!)
原文地址:https://www.cnblogs.com/zhazhaacmer/p/8933151.html