当前位置:编程学习 > C/C++ >>

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

易做图容斥原理  纪念一下  易做图看了好久才明白DFS...
 
先贴代码后解释
 
 
#include<cstdio>  
#include<cstring>  
using namespace std;  
#define LL long long  
#define N 11  
  
LL num[N],ans,n;  
int m,cnt;  
  
LL 易做图(LL a,LL b)  
{  
    int t;  
    while(b)  
    {  
        t=a%b;  
        a=b;  
        b=t;  
    }  
    return a;  
}  
  
  
void dfs(int id,bool flag,LL LCM)  
{  
    LCM=num[id]/易做图(num[id],LCM)*LCM;  
    if(flag)ans+=n/LCM;  
    else ans-=n/LCM;  
    int i;  
    for(i=id+1;i<cnt;i++)  
    {  
        dfs(i,!flag,LCM);  
    }  
}  
  
int main()  
{  
    int i;  
    while(scanf("%lld%d",&n,&m)!=EOF)  
    {  
        ans=cnt=0;  
        for(i=0;i<m;i++)  
        {  
            scanf("%lld",&num[i]);  
            if(num[i])num[cnt++]=num[i];  
        }  
        n--;  
        for(i=0;i<cnt;i++)  
            dfs(i,1,num[i]);  
        printf("%lld\n",ans);  
    }  
  
    return 0;  
}  

 

 
DFS看不懂的话  一定去自己按树模拟一下,这是对难解的代码的最好方法之一
第一:小于n的数  所以n--别忘
 
第二:flag为1,说明是奇数层,加,为0,说明是偶数层要减
 
第三:小心  题中说的是非负数  所以判断是不是0
 
第四:注意DFS做容斥的方法,模拟一下  真的好理解
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,