#include<bits/stdc++.h>
using namespace std;
void solve() {
int n; cin >> n;
map <int, int> mp;
for (int i = 1, x; i <= n; i++) {
cin >> x; mp[x] ++;
}
int ans = 0;
for (const pair <int, int> &i : mp) {
ans += i.second / 3;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}
/*
当它们 -1 时
2^0 --- 00000001 1位 0
2^1 --- 00000010 1位 1
2^2 --- 00000100 1位 2
2^3 --- 00001000 1位 3
2^4 --- 00010000 1位 4
2^5 --- 00100000 1位 5
2^6 --- 01000000 1位 6
2^7 --- 10000000 1位 7
.....
所以你会发现有个规律
可以得出一个小结论 遍历 (1 << i - 1) 只要它大于k的时候截止 且下一个值是 k - (1 << i - 1) 在后面就00000即可构造
不过要单独判断一下 n == 1的时候
*/
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n, k, x = 1; cin >> n >> k;
if (n == 1) {
cout << k << '\n';
return ;
}
while ((x << 1 | 1) < k) {
x = x << 1 | 1;
}
cout << x << ' ' << k - x << ' ';
for (int i = 3; i <= n; i++) cout << 0 << ' ';
cout << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}
1-
r == c -> 一行一列
2-
r != c 两行两列
首先我们使用递归的思想来证明一下这个dp[i] = dp[i - 1] + dp[i - 2] * (i - 1) * 2
先不管取模
come
经过了某一些操作 我们使得 剩下 {1, 5, 8, 9, 10} -- 假设
那么我们应该这么去排呢 应该是 挑一个 不如 {} 中的任意一个 dp[i - 1] * 1
那么剩下的不久应该在 dp[i - 2] * 2 * (n - 1) 在这里找 为什么 这里*2 是因为(i, j) --- (j, i) 他们有两种情况
看图
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7, N = 3e5 + 5;
int dp[N], n, k;
void init() {
for (int i = 1; i <= n; i++) {
dp[i] = -1;
}
}
long long check(int n) {
if (n <= 1) return 1LL;
if (dp[n] != -1) return (dp[n] % mod) * 1LL;
return dp[n] = ((check(n - 1) % mod + check(n - 2) % mod * (n - 1) % mod * 2LL % mod) % mod) * 1LL;
}
void solve() {
cin >> n >> k;
set <int> st;
for (int i = 1, x, y; i <= k; i++) {
cin >> x >> y; st.insert(x); st.insert(y);
}
int m = n - st.size();
init();
cout << check(m) << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7, N = 3e5 + 5;
long long dp[N]; int n, k;
void init() {
for (int i = 1; i <= n; i++) dp[i] = 0;
dp[0] = dp[1] = 1;
}
void solve() {
cin >> n >> k;
set <int> st;
for (int i = 1, x, y; i <= k; i++) {
cin >> x >> y; st.insert(x); st.insert(y);
}
int m = n - st.size();
init();
for (int i = 1; i <= m; i++) {
dp[i] = (dp[i - 1] % mod + dp[i - 2] % mod * (i - 1) % mod * 2LL % mod) % mod;
}
cout << dp[m] << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}
/*
f(x, y) ^ f(y, z) > f(x, z)
-->这里的y被计算了两次以此S(z) ^ S(x - 1) ^a[y]
把它换成异或前缀和
--> S(z) ^ S(x - 1) ^ a[y] > S(z) ^ S(x - 1)
所以需要去枚举a[y] 只有是1 才可以去改变
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, M = 35;
using i64 = long long;
int s[N], a[N];
i64 c[M][N];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i]; s[i] = s[i - 1] ^ a[i];
for (int j = 0; j < 30; j++) {
c[j][i] = c[j][i - 1] + (s[i] >> j & 1);
}
}
i64 ans = 0;
for (int i = 1; i <= n; i++) {
int k = 29; k++;
while (k >= 0 && (a[i] >> k & 1) == 0) k--;
if (k == -1) continue;
ans += (c[k][n] - c[k][i - 1]) * c[k][i - 1];
ans += (n - i + 1 - (c[k][n] - c[k][i - 1])) * (i - c[k][i - 1]);
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
return 0;
}