1. 程式人生 > >T13432 1.計數

T13432 1.計數

pan spa sin logs color () 容斥 long long ret

題目描述

給出m個數a[1],a[2],…,a[m]

求1~n中有多少數不是a[1],a[2],…,a[m]的倍數。

輸入輸出格式

輸入格式:

輸入文件名為count.in。

第一行,包含兩個整數:n,m

第二行,包含m個數,表示a[1],a[2],…,a[m]

輸出格式:

輸入輸出樣例

輸入樣例#1:
count.in	count.out
10 2
2 3	            3
輸出樣例#1:
輸出一行,包含1個整數,表示答案

說明

對於60%的數據,1<=n<=106

對於另外20%的數據,m=2

對於100%的數據,1<=n<=109,0<=m<=20,1<=a[i]<=109

補幾發題解

容斥,奇數個數的|lcm|減去,偶數個的加上

#include<cstdio>
using namespace std;
#define LL long long
int a[40];
int n,m;
int gcd(int x,int y) {
    if(y==0)return x;
    else return gcd(y,x%y);
}
LL ans=0;
void dfs(int num,int
step,LL lcm) { if(lcm>n)return ; if(num==m+1){ if(step%2==1)ans-=n/lcm;//奇數個時加上 else if(step)ans+=n/lcm;//偶數個時減去 return ; } dfs(num+1,step,lcm); LL tmp=lcm*a[num]/gcd(lcm,a[num]);//選擇該數 dfs(num+1,step+1,tmp); } int main () { scanf("%d%d",&n,&m); ans
=n; for(int i=1;i<=m;++i ) { scanf("%d",a+i); } dfs(1,0,1); printf("%lld\n",ans); return 0; }

T13432 1.計數