题目
Xiaoz最近的一个新游
n个灯泡,编号1-n.,Xiaoz每次给两个数,编号为两个数质因子灯泡 状态改变(开,关),(原来灯泡都开),0,0结束,求最后开着的灯。
样例输入
1 100
2 3
0 0
样例输出
100
代码
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
#define maxn 1000003
int vis[maxn];
int prime[maxn];
void prime1()//求出所有素数
{
prime[1]=1;
prime[0]=1;
for(int i=2;i<=sqrt(maxn);i++)
{
if(!prime[i])
for(int j=i*2;j<=maxn;j+=i)
{
prime[j]=1;
}
}
}
int main()
{
ll t,n;
memset(prime,0,sizeof(prime));
prime1();
while(cin>>t>>n&&(t||n))//t (a,b)组数,n个数
{
ll a,b;
memset(vis,0,sizeof(vis));
ll sum=0;
while(t--)//a,b的共同质因数状态变化
{
cin>>a>>b;
for(int i=2;i<maxn;i++)
{
if(a%i==0&&b%i==0&&!prime[i])
{
vis[i]=vis[i]^1;
}
}
}//遍历求得开着的灯的数量
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
sum++;
}
cout<<sum<<endl;
}
}