Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define endl '\n'
- #define sz(v) (int)v.size()
- #define all(v) v.begin(), v.end()
- void dbg_out() { cerr << "\b\b]\n"; }
- template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T){ cerr << H << ", "; dbg_out(T...);}
- #define watch(...) cerr << "[" << #__VA_ARGS__ << "]: [", dbg_out(__VA_ARGS__)
- /****************************** CODE IS HERE ***********************************/
- const int mod = 998244353;
- const int lg = 21, N = 1e6 + 2;
- int power(ll a, ll b){
- ll res = 1;
- while(b){
- if(b & 1)
- res = (res * a) % mod;
- a = (a * a) % mod;
- b >>= 1;
- }
- return res;
- }
- int main(){
- ios_base::sync_with_stdio(false); cin.tie(nullptr);
- int n, q; cin >> n >> q;
- vector <int> A(N+2, 0);
- for (int i = 0, x; i < n; ++i){
- cin >> x;
- A[x]++;
- }
- vector <int> res(N+2, 0);
- vector <vector<int>> dp(N, vector<int> (lg, 0));
- for (int mask = 0; mask < N; ++mask){
- for (int i = 0; i < lg; ++i){
- if(mask & (1 << i)){
- if(i == 0)
- dp[mask][i] = A[mask] + A[mask^(1<<i)];
- else
- dp[mask][i] = dp[mask][i-1] + dp[mask^(1<<i)][i-1];
- }
- else{
- if(i == 0)
- dp[mask][i] = A[mask];
- else
- dp[mask][i] = dp[mask][i-1];
- }
- }
- res[mask] = dp[mask][lg-1];
- }
- while(q--){
- int x; cin >> x;
- ll ans = 1LL*res[x]*power(n, mod-2) % mod;
- cout << ans << endl;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment