求几个数的组合数 容斥原理

来源:岁月联盟 编辑:exp 时间:2012-08-03
 准备做一些容斥原理的题目,其中容斥原理要求一个数的因子的任意组合。比如 30 = 2 * 3 * 5,则需要求出(2),(3),(5),(2,3),(2,5),(3,5),(2,3,5)这些组合,可以用dfs实现,写了一个,留下来作个模板。
代码:
[cpp] 
#include <iostream> 
#include <cstdio> 
#include <string.h> 
using namespace std; 
 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
int num[4]={2,3,5,7}; 
int linnum[4]; 
int flag[4]; 
void dfs(int id,int begin,int cnt){ 
    if(id == cnt){ 
      for(int i = 0;i < 4;++i) 
          printf("%d ",linnum[i]); 
      printf("/n"); 
      return; 
    } www.2cto.com
    for(int i = begin;i < 4; ++i){ 
        if(!flag[i]){ 
          flag[i] = true; 
          linnum[id] = num[i]; 
          dfs(id+1,i,cnt); 
          flag[i] = false; 
        } 
    } 

int main(){ 
    for(int i = 1;i <= 4;++i){ 
        CLR(flag,0); 
        CLR(linnum,0); 
      dfs(0,0,i); 
      printf("ss/n"); 
    } 
    return 0; 


作者:wmn_wmn