T13432 1.計數
阿新 • • 發佈:2017-10-14
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,intstep,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.計數