24h購物| | PChome| 登入
2009-09-20 18:44:29| 人氣1,686| 回應1 | 上一篇 | 下一篇

排容原理

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : 排容原理 + 生成組合 + GCD

為了方便說明,
先定義LCM(A) 是取A集合的最小公倍數
C(A,B) 是從A個數字中抓B個出來
那麼C是從M個數字抓

答案就是

N/LCM(C(M,0))-N/LCM(C(M,1))+N/LCM(C(M,2))-N/LCM(C(M,3))...

N/LCM(C(M,M))

/**********************************************************/

#include<stdio.h>
#include<stdlib.h>
int n,m,a,b;
int value[51]={0};
int GCD(int a,int b)                 
{                 
  int temp;                 
  while(a%b)                       
   {                       
     temp=a;                       
     a=b;                       
     b=temp%b;                                  
   }     
   return b;                 
}
int way[51]={0};
int sum;
void make (int now,int a,int n,int m,int s,int div)
{
  int b=a,c;
       if(now%2==0) sum-=div/s;
       else sum+=div/s;
  if(now==m+1)  return;
  else
  for(b=a;b<=n;b++)
   {
    way[now]=b;
    make(now+1,b+1,n,m,s/GCD(s,value[way[now]])*value[way[now]],div);
   }
}
main()
{
 while(scanf("%d %d",&n,&m)==2)
    {
     if(n==0&&m==0) break;
     for(a=1;a<=m;a++)
        scanf("%d",&value[a]);
     sum=0;
     make(1,1,m,m,1,n);
     printf("%d\n",sum);
    }
 return 0;  
}

台長: 來源不明
人氣(1,686) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:生成因數
此分類上一篇:Divisors II

zlggc
台灣硬起來! 抵制菲律賓!!
2013-05-19 00:49:09
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文