题目描述见链接 .
若 中存在能够 凑出 的数字, 则可以凑出所有数字 .
于是考虑哪些数字可以凑出 ,
个数字 , 有解的前提是 , 推广到更多数字 有解的前提是 .
于是 题目转化 为: 求出有多少种选数方法, 满足 .
考虑 容斥, 设 表示满足以 为 的选出序列的个数,
初值 为 , 减去所有 即可得到 的序列数, 最后 即为答案 .
#include<bits/stdc++.h>
#define reg register
int read(){
char c;
int s = 0, flag = 1;
while((c=getchar()) && !isdigit(c))
if(c == '-'){ flag = -1, c = getchar(); break ; }
while(isdigit(c)) s = s*10 + c-'0', c = getchar();
return s * flag;
}
const int maxn = 3005;
const int mod = 998244353;
int N;
int Max_v;
int A[maxn];
int F[maxn];
int pw[maxn];
int main(){
N = read(); pw[0] = 1;
for(reg int i = 1; i < maxn; i ++) pw[i] = 2ll*pw[i-1] % mod;
for(reg int i = 1; i <= N; i ++) A[i] = read(), Max_v = std::max(Max_v, A[i]);
for(reg int i = Max_v; i >= 1; i --){
int cnt = 0;
for(reg int j = 1; j <= N; j ++) cnt += (A[j]%i == 0);
F[i] = pw[cnt] - 1;
for(reg int j = 2*i; j <= Max_v; j += i) F[i] -= F[j], F[i] = (F[i]%mod+mod)%mod;
}
printf("%d
", F[1]);
return 0;
}