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,并且要用数组进行标记防止加了两次!举例,某十进制数y,依次进行逐位拆分,如果有数码x,就加上2的x次方--并且进行标记,没有的话不加!N=10^7,一个数也不会很大!时间复杂度大概在10^8左右,单实例可以过!
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\n",i,hash2[i]); 29 ans+=(ll)hash2[i]*(ll)(hash2[i]-1)/(ll)2; 30 } 31 32 } 33 printf("%lld\n",ans); 34 35 } 36 37 return 0; 38 }