比赛 2025.5.5 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 friends 最终得分 100
用户昵称 darkMoon 运行时间 14.087 s
代码语言 C++ 内存使用 5.54 MiB
提交时间 2025-05-05 10:11:13
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
auto IN = freopen("friends.in", "r", stdin);
auto OUT = freopen("friends.out", "w", stdout);
auto IOS = ios::sync_with_stdio(false);
auto CIN = cin.tie(nullptr);
const int M = 262144 << 1, N = 1e5 + 5;
int n, k, a[N], su[M], m, ma;
bool check(int mid){
    memset(su, 0, sizeof(su));
    for(int i = 1; i <= mid; i ++){
        int tmp = 0;
        for(int j = 1; j <= n; j ++){
            if((i + a[j] - 1) / a[j] % 2){
                tmp |= 1 << j - 1;
            }
        }
        su[tmp] ++;
        // cout << "*** " << i << " " << (bitset<3>)tmp << "\n";
    }
    for(int j = 0; j < n; j ++){
        for(int i = 0; i < ma; i ++){
            if(i >> j & 1){
                su[i] += su[i ^ (1 << j)];
            }
        }
    }
    for(int i = 1; i < ma; i ++){
        if(su[(ma - 1) ^ i] > mid - k * __builtin_popcount(i)){
            return 0;
        }
    }
    return 1;
}
signed main(){
    cin >> n >> k;
    ma = 1 << n;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    int l = 0, r = 2 * n * k;
    while(l < r){
        int mid = l + r >> 1;
        if(check(mid)){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    printf("%lld", l);
    return 0;
}