zcmu1776: Press the switch【數學題】

1776: Press the switch

 

Description

達達的家裏有一串長度爲n的燈泡,編號1,2,3,4.....n-1,n。每一個燈泡都有一個開關,達達每次選一個數a,把編號爲a的倍數的燈泡的開關都按一遍。

假定燈剛開始都開着,他做了m次這樣的事,問他爸媽打他沒有?偶,不不不,問最後有幾個燈開着。

 

Input

多組測試數據,第一行輸入一個n(1<=n<=1e12)

第二行數輸入一個數m(0<=m<=2)

接下來輸入m個數ai(1<=ai<=min(1000,n))

 

Output

輸出最後結果

 

Sample Input

100 1 2 5 2 2 3 100000000000 1 1

Sample Output

50 2 0

解題思路:因爲m就三種情況,m=0時,毫無疑問輸出n;當m=1的時候,就是n-n/a(n/a說明從1到n有幾個是被a整除,這個應該很好理解);當m=2時,就是n-(n/a+n/b-(n/(a*b)/gcd(a,b))*2),後面括號的是按了2次,說明是亮的,爲什麼要乘以2,因爲我們多算了2次。


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
	if(a<b) swap(a,b);
	if(b) return gcd(b,a%b);
	return a;
}
int main(void)
{
	ll n;
	while(~scanf("%lld",&n))
	{
		int m;
		scanf("%d",&m);
		if(m==0) 
		{
			printf("%lld\n",n);
			continue;	
		}	
		if(m==1)
		{
			int a;
			scanf("%d",&a);
			printf("%lld\n",n-n/a);
		}
		else if(m==2)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			int e=gcd(a,b);
			int d=a*b/e;
			printf("%lld\n",n-(n/a+n/b-n/d*2));
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章