HDU 1796 How many integers can you find 容斥原理

来源:互联网 发布:mac os sierra gm 编辑:程序博客网 时间:2024/05/16 14:31
WA了N久N久... 最后发现原来是自己有些特殊情况没有存好。
一个条件读入的数据要符合(1,N)这个区间范围内....
在处理的时候没有处理好,天真的没有排除,只是当有这样的数据的时候跳过.... 当然... 悲剧发生了= =
无限WA.....
使用容斥原理...
容斥原理就不讲了..
我用的位运算做的...等会儿再用dfs做一下....
#include<iostream>#include<string.h>#include<cstdio>#include<algorithm>using namespace std;__int64 N,M;__int64 date[20];__int64 gcd( __int64 a,__int64 b ){         if( b==0 ) return a;         else return gcd( b,a%b );}int getnum( int n ){     int sum=0;     __int64 lcm=1;     for( int i=0;i<M;i++ )          if( n&(1<<i) )               sum++,lcm=lcm*date[i]/gcd(lcm,date[i]);    if( sum&1 )        return N/lcm;    else        return -(N/lcm);}int main(){     while( scanf("%I64d%I64d",&N,&M)!=EOF )     {            __int64 ans=0,x;            int d=0;            for( int i=0;i<M;i++ )            {                 scanf( "%I64d",&x );                 if( x>0&&x<N )                  date[d++]=x;}N--;M=d;            for( int i=1;i<(1<<M);i++ )                   ans+=getnum(i);           printf( "%I64d\n",ans );      }     return 0;}

下面是dfs的版本,果然还是dfs快啊!!!

#include<iostream>using namespace std;__int64 N,M;__int64 d[22];__int64 gcd( __int64 a,__int64 b ){ if( b==0 ) return a; else return gcd( b,a%b );} void dfs( int cur,int count,__int64 lcm,__int64 &sum ){  lcm=lcm*d[cur]/gcd(d[cur],lcm);  if( count&1 ) sum+=N/lcm;  else sum-=N/lcm;  for( int i=cur+1;i<M;i++ )    dfs( i,count+1,lcm,sum );}int main(){ while( scanf("%I64d%I64d",&N,&M)!=EOF ) {    __int64 x,cnt=0;    for( int i=0;i<M;i++ )    {   scanf( "%I64d",&x );   if( x>0&&x<N )   d[cnt++]=x;      }      M=cnt;N--;      __int64 ans=0;      for( int i=0;i<M;i++ )      dfs( i,1,d[i],ans );      printf( "%I64d\n",ans );  } return 0;}




原创粉丝点击