代码大常数求助玄关
查看原帖
代码大常数求助玄关
651793
Rosent楼主2024/10/2 13:34

rt,TLE on # 91,没有死循环。

不会卡常数啊/kel

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define int long long
#define maxn 30

// #ifndef ONLINE_JUDGE
#define getchar_unlocked() getchar()
// #endif

using namespace std;

int read() {
    int x=0,flag=1;char c=getchar_unlocked();
    while(c<'0'||c>'9') {if(c=='-')flag=-1;c=getchar_unlocked();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar_unlocked();}
    return x*flag;
}

int n, K, s, ans = 0;
int a[maxn];
int opr[maxn];
map <pair<int, int>, int> p;

int frac(int k) {
    int sum = 1;
    for (int i = 1 ; i <= k; i++) {
        sum *= i;
        if (sum > s) {
            sum = s + 1;
            break;
        }
    }
    return sum;
}

void dfs(int k, int op) {
    if (k > n / 2) {
        return;
    }
    int now = 0;
    for (int i = 1; i <= n / 2; i++) {
        if (opr[i] == 1) {
            now += a[i];
        }
        else if (opr[i] == 2) {
            now += frac(a[i]);
        }
    }
    int res = 0;
    for (int i = 1; i <= n / 2; i++) {
        if (opr[i] == 2) {
            res++;
        }
    }
    if (k == n / 2 && now <= s)
        p[{now, res}] ++;
    opr[k + 1] = 0; dfs(k + 1, 0);
    opr[k + 1] = 1; dfs(k + 1, 1);
    opr[k + 1] = 2; dfs(k + 1, 2);
    opr[k + 1] = 0;
    return ;
}

void dfs2(int k, int op) {
    if (k > n) {
        return;
    }
    int now = 0;
    for (int i = n / 2 + 1; i <= n; i++) {
        if (opr[i] == 1) {
            now += a[i];
        }
        else if (opr[i] == 2) {
            now += frac(a[i]);
        }
    }
    int res = 0;
    for (int i = n / 2 + 1; i <= n; i++) {
        if (opr[i] == 2) {
            res++;
        }
    }
    if (k == n && now <= s) { 
        for (int i = 0; i <= K - res; i++) {
            ans += p[{s - now, i}];
        }
    }
    opr[k + 1] = 0; dfs2(k + 1, 0);
    opr[k + 1] = 1; dfs2(k + 1, 1);
    opr[k + 1] = 2; dfs2(k + 1, 2);
    opr[k + 1] = 0;
    return ;
}

signed main() {
    n = read(), K = read(), s = read();
    for (int i = 1; i <= n; i++) {
        a[i] = read();
    }
    dfs(0, 0);
    // for (const auto& [key, value] : p) {
    //     std::cout << "Key: (" << key.first << ", " << key.second << "), Value: " << value << "\n";
    // }
    dfs2(n / 2, 0);

    cout << ans << endl;
    return 0;
}
2024/10/2 13:34
加载中...