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;
}