zju 1836 Number Puzzle

容斥原理的应用
#include < iostream >
#include 
< string >
using   namespace  std;

int  a[ 12 ];
int  b[ 12 ];
int  n, m;
double  total;
int  gcd( int  x,  int  y)
{
    
return y==0?x:gcd(y,x%y);
}

int  gsm( int  x,  int  y)
{
    
return (x*y)/gcd(x,y);
}

void  dfs( int  u,  int  sum,  int  cnt,  int  vn)
{
    
int i;
    
if(cnt==vn)
    
{
        total 
+= m/sum;
        
return;
    }

    
for (i=u; i<n; ++i)
    
{
        dfs(i
+1, gsm(sum,b[i]), cnt+1, vn);
    }

}

int  main()
{
    
int i, j, temp;
    
double ans;
    
while (cin >> n >> m)
    
{
        memset(a, 
0sizeof(a));
        
for (i=0; i<n; ++i)
        
{
            scanf(
"%d"&temp);
            a[temp] 
= 1;
        }

        n 
= 0;
        
for (i=1; i<=10++i)
        
{
            
if(a[i] && i<=m)
                b[n
++= i;
        }

        ans 
= 0;
        
for (i=1; i<=n; ++i)
        
{
            total 
= 0;
            dfs(
0,1,0,i);
            
if(i%2!=0)
                ans 
+= total;
            
else
                ans 
-= total;
        }

        printf(
"%.0lf ",ans);
    }

    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值