Implementation
D_AND_array.cpp
Wrap
Copy code
Full screen
C++
1 #include <bits/stdc++.h>
2 using namespace std;
3 using ll = long long ;
4 using i128 = __int128;
5 const int inf = 1e9 ;
6 const ll INF = 1e18 ;
7 const int mod = 1000000007 ;
8 const int MM = 100000 + 5 ;
9 ll fac[MM ], ifac[MM ];
10 ll power (ll a, ll b) {
11 ll res = 1 ;
12 while (b) {
13 if (b & 1 ) res = res * a % mod;
14 a = a * a % mod;
15 b >> = 1 ;
16 }
17 return res;
18 }
19 void solve () {
20 int n; cin >> n;
21 vector < ll> b (n + 1 );
22 for (int i = 1 ; i <= n; i++ ) {
23 cin >> b[i];
24 }
25 vector < pair < int , ll>> v;
26 auto cal = [& ] (int n, int k) -> ll {
27 if (k < 0 || k > n) return 0 ;
28 return fac[n] * ifac[k] % mod * ifac[n - k] % mod;
29 };
30 for (int i = n; i >= 1 ; i-- ) {
31 ll cur = b[i];
32 for (auto [j, wj] : v) {
33 cur = (cur - 1LL * wj * cal (j, i)) % mod;
34 if (cur < 0 ) cur + = mod;
35 }
36 if (cur != 0 ) {
37 v.emplace_back (i, cur);
38 }
39 }
40 vector < int > cnt (29 );
41 for (auto [j, wj] : v) {
42 for (int bit = 0 ; bit < 29 ; bit++ ) {
43 if ((wj >> bit) & 1 ) {
44 cnt[bit] = j;
45 }
46 }
47 }
48 vector < int > a (n);
49 for (int bit = 0 ; bit < 29 ; bit++ ) {
50 for (int i = 0 ; i < cnt[bit]; i++ ) {
51 a[i] | = (1 << bit);
52 }
53 }
54 for (int i = 0 ; i < n; i++ ) {
55 cout << a[i] << (i == n - 1 ? '\n' : ' ' );
56 }
57 }
58 int main () {
59 ios:: sync_with_stdio (0 ); cin.tie (0 );
60 fac[0 ] = 1 ;
61 for (int i = 1 ; i < MM ; i++ ) {
62 fac[i] = fac[i - 1 ] * i % mod;
63 }
64 ifac[MM - 1 ] = power (fac[MM - 1 ], mod - 2 );
65 for (int i = MM - 2 ; i >= 0 ; i-- ) {
66 ifac[i] = ifac[i + 1 ] * (i + 1 ) % mod;
67 }
68 int t; cin >> t;
69 while (t-- ) {
70 solve ();
71 }
72 return 0 ;
73 }