Link
gcd 思维 1900
题意
设 g c d ( S ) gcd(S) gcd(S) 为集合 S S S 中所有数的gcd,现给出集合 S S S ,求它的所有子集的gcd中不属于 S S S的数有多少个( n , a i ≤ 1 e 6 n, a_i \leq 1e6 n,ai≤1e6)
思路
若
x
x
x 在新集合中出现,则它一定是原集合中几个
x
x
x 的倍数取gcd得到的。
方法:检验所有
x
x
x 的倍数的gcd是不是
x
x
x,比如6和12无论如何也得不到3。
代码
int n;
int in[maxn];
ll gcd(ll a, ll b) {
if(!b) return a;
return gcd(b, a % b);
}
void solve() {
cin >> n;
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
in[x] = 1;
}
int cnt = 0;
for(int i = 1; i < N; i++) {
if(in[i]) continue;
ll t = 0;
for(int j = i; j < N; j += i) {
if(in[j]) t = gcd(t, j);
}
if(i == t) cnt++;
}
cout << cnt << endl;
}