题目
给出 n 个数和 m ,问0 ~ m 中,有多少是和给出的这n个数互质。
思路
可以把 n 个数的所有的质因数分解,然后存到数组里,然后用筛质数的方式把所有的数打表出来,然后循环一遍1 ~ m,如果没有标记的话,就说明当前的数与给出的 n 个数都互质,符合题意
AC code
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 20;
int n, m, cnt;
int a[N], b[N], c[N], d[N];
int main()
{
scanf("%d%d",&n, &m);
for(int i = 0; i < n; i++ )
{
scanf("%d", &a[i]);
for(int j = 2;j <= a[i] / j; j ++)
{
if(a[i] % j == 0)
{
b[j] = 1;
while(a[i] % j == 0)
a[i] /= j;
}
}
if(a[i] > 1)
b[a[i]] = 1;
}
for(int i = 2;i <= m;i ++)
{//将所有的质因数从小到大存起来
if(b[i])
c[++ cnt] = i;
}
for(int i = 1;i <= cnt;i ++)
{//打表,如果当前的数是有 i 这个因数,就标记一下
for(int j = c[i] + c[i];j <= m;j += c[i])
b[j] = 1;
}
vector <int> ans;
for(int i = 1;i <= m;i ++)
{// 没有被标记的说明是符合要求的
if(!b[i])
ans.push_back(i);
}
printf("%d\n",ans.size());
for(int i = 0; i < ans.size(); i ++)
printf("%d\n", ans[i]);
return 0;
}