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

原创 2012年03月21日 19:21:45
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;
}




版权声明:本文为博主原创文章,转载请写明出处。

相关文章推荐

Hdu 1796 How many integers can you find (容斥原理 递归及循环的一般写法)

题意:给出n和由m个元素的集合,求小于n且是集合中任意元素的倍数的数有多少个。 把集合中的0先去掉。 #include int data[20],n,m,cnt; __int64 sum; ...

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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1796 题意:给你两个数n(n 分析:先不考虑重叠的部分,把小于n,且能整除a1的数的个数求出来,即(n...
  • w20810
  • w20810
  • 2015年02月21日 18:08
  • 352

HDU 1796 How many integers can you find(容斥原理+二进制/DFS)

求n以内能够被所给的集合中的数整除的数的个数。

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

题目链接:How many integers can you find 题面: How many integers can you find Time Limit: 12...

hdu1796 How many integers can you find----容斥原理

How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768...

HDU 1796 How many integers can you find(组合数学-容斥原理)

How many integers can you find Problem Description   Now you get a number N, and a M-integers ...
  • wujy47
  • wujy47
  • 2014年08月03日 12:31
  • 380

HDU 1796 How many integers can you find(简单容斥原理)

题目大意:有一个序列,大小为m,里面有m个不超过20的非负数,各不相同。要求在1-n中有多少个能被m个数中任意一个数整除。 题目思路:简单的容斥原理应用。就不说了直接上代码。 有两种方法,一种是D...

hdu1796 How many integers can you find(容斥原理裸)

http://acm.hdu.edu.cn/showproblem.php?pid=1796 题意:求小于n的数中有多少个能被集合m中元素整除。 思路:挑战上的裸题,还基本是看的别人的...

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

传送门:hdu 1796 How many integers can you find题目大意在M个集合中,找到能被N整除(不包含N)的个数解题思路首先要解决这个题目要知道什么容斥定理! 我们先假设...

hdu-1796-How many integers can you find(容斥)

hdu-1796-How many integers can you find(容斥)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 1796 How many integers can you find 容斥原理
举报原因:
原因补充:

(最多只允许输入30个字)