Submission #1292373

#TimeUsernameProblemLanguageResultExecution timeMemory
1292373BuzzyBeezParty (INOI20_party)C++20
7 / 100
55 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;
const int N = 60, M = 200;

long long dp_small[M + 8], dp[64], c[M * 2 + 8];
vector<int> adj[M + 8];
int d[M + 8];

void DFS(int u, int p) {
	d[u] = d[p] + 1;
	for (int v : adj[u]) if (v != p) DFS(v, u);
}

long long res_pw;
long long qpow(long long x, long long expo) {
	res_pw = 1;
	while (expo) {
	    if (expo & 1) res_pw = res_pw * x % mod;
	    x = x * x % mod;
	    expo >>= 1;
	}
	return res_pw;
}
 
void prep() {
	d[0] = -1;
	for (int n = 1; n <= M; ++n) {
		for (int i = 1; i <= n; ++i) {
			if (i / 2 > 0) adj[i].push_back(i / 2);
			if (i * 2 <= n) adj[i].push_back(i * 2);
			if (i * 2 + 1 <= n) adj[i].push_back(i * 2 + 1);
		}
		for (int r = 1; r <= n; ++r) {
			DFS(r, 0);
			for (int i = 1; i <= n; ++i) ++c[d[i]];
			int sf = 0;
			for (int i = n + n; i; --i) {
				sf += c[i];
				dp_small[n] = (dp_small[n] + qpow(2, sf) - 1) % mod;
			}
			memset(c, 0, sizeof c);
		}
		dp_small[n] = dp_small[n] * qpow(qpow(2, n) - 1, mod - 2) % mod;
		for (int i = 1; i <= n; ++i) adj[i].clear();
	}
	for (int h = 1; h <= N; ++h) {
		// n = 2^h - 1
		for (int i = 0; i < h; ++i) {
			for (int j = i; j >= 0; --j) {
				c[i - j] = (c[i - j] + 1) % mod;
				for (int k = j + 1; k < h; ++k) {
					c[i - j + k - j] = (c[i - j + k - j] + qpow(2, k - j - (j < i))) % mod;
				}
			}
			long long sf = 0, cur = 0;
			for (int i = h + h; i; --i) {
				sf = (sf + c[i]) % mod;
				cur = (cur + qpow(2, sf) - 1) % mod;
			}
			dp[h] = (dp[h] + cur * ((1LL << i) % mod)) % mod;
			memset(c, 0, sizeof c);
		}
		dp[h] = dp[h] * qpow(qpow(2, (1LL << h) - 1) - 1, mod - 2) % mod;
	}
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	prep();
	int tc; long long n; cin >> tc;
	while (tc--) {
		cin >> n;
		if (n <= M) cout << dp_small[n] << '\n';
		else cout << dp[__lg(n) + 1] << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...