JZYZOJ1376 [coci2011]友好数对 容斥定理 状态压缩

Posted 鲸头鹳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZYZOJ1376 [coci2011]友好数对 容斥定理 状态压缩相关的知识,希望对你有一定的参考价值。

http://172.20.6.3/Problem_Show.asp?id=1376

题意:找给出的数中含有相同数字的数对的对数。

mmp数论题竟然卡快读,莫名拉低通过率什么的太过分了。

刚开始想到了怎么容斥但是没法实现,看了标程发现需要状压,我还是太菜了。

代码

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<cmath>
 6 using namespace std;
 7 const long long maxn=1<<11;
 8 const int modn=10000;
 9 long long n;
10 long long a[maxn+10]={};
11 long long b[maxn+10]={};
12 long long read(){
13     long long x=0;char ch=getchar();
14     while(ch>9||ch<0)ch=getchar();
15     while(ch<=9&&ch>=0){x*=10;x+=ch-0;ch=getchar();}
16     return x;
17 }
18 int main(){
19     n=read();
20     long long x,y=0;
21     int ma=1<<10;
22     for(int i=1;i<=n;i++){
23         x=read();;y=0;
24         while(x){
25             y|=1<<(x%10);x/=10;
26         }
27         a[y]++;
28     }
29     for(int i=1;i<ma;i++){
30         for(int j=i;j<ma;j++){
31             if((i|j)==j)b[i]+=a[j];
32         }
33     }
34     long long ans=0;
35     for(int i=1;i<ma;i++){
36         if(b[i]==0||b[i]==1)continue;
37         long long cnt=0;
38         for(int j=0;j<10;j++){
39             long long w=1<<j;w&=i;
40             if(w)cnt++;
41         }
42         if(cnt&1)ans+=b[i]*(b[i]-1)/2;
43         else ans-=b[i]*(b[i]-1)/2;
44     }
45     printf("%I64d\n",ans);
46     return 0;
47 }
View Code

 

以上是关于JZYZOJ1376 [coci2011]友好数对 容斥定理 状态压缩的主要内容,如果未能解决你的问题,请参考以下文章

COCI2011:友好数对

JZYZOJ1369 [coci2012]覆盖字符串 AC自动机

1105 判断友好数对

友好数对

1105: 判断友好数对(函数专题)

zzuli oj 1105 友好数对