描述
xx的家里有一串长度为n的灯泡,编号1,2,3,4.....n-1,n。每一个灯泡都有一个开关,xx每次选一个数a,把编号为a的倍数的灯泡的开关都按一遍。
假定灯刚开始都开着,他做了m次这样的事,问他爸妈打他没有?偶,不不不,问最后有几个灯开着。
输入
多组输入
第一行输入一个n(1<=n<=1e12)
第二行数输入一个数m(0<=m<=2)
接下来输入m个数ai(1<=ai<=min(1000,n)
输出
输出最后结果
输入样例 1
100
1
2
输出样例 1
50
题目中操作次数只有0=<m<=2所以只需要分情况讨论即可,如果m为0那么直接输出n,如果为1就减去n/a,如果m为2,则输入两个找出他们的最小公倍数,然后减去n除以这两个数,再加上两倍 n除以最小公倍数。
#include <iostream>
using namespace std;
int main()
{
long long n,m;
while(cin>>n)
{
cin>>m;
if(m==0)
cout<<n<<endl;
else if(m==1)
{
int a;
cin>>a;
cout<<n-n/a<<endl;
}
else
{
int a,b;
cin>>a>>b;
int x=a,y=b;
while(y)
{
if(y>x)
swap(x,y);
int temp=x%y;
x=y;
y=temp;
}
int X=a*b/x;
long long sum=n-n/a-n/b+(n/X)*2;
cout<<sum<<endl;
}
}
return 0;
}