牛客挑战赛46

牛客挑战赛46

a 奇怪的计算器

c/c++作业题

int get(char c) {
    if (c == '-') return 0;
    else if (c == '+') return 1;
    return 2;
}
 
int main() {
    IOS; string s; cin >> s;
    stack<ll> st, op;
    ll a = 0;
    bool g = 0;
    for (auto i : s) {
        if (isdigit(i)) { g = 1; a = a * 10 + (i ^ '0'); continue; }
        if (g) st.push(a), a = g = 0;
        int c = get(i);
        if (op.empty()) op.push(c);
        else {
            while (!op.empty() && (op.top() == 2 || c < 2)) {
                ll x = st.top(); st.pop();
                ll y = st.top(); st.pop();
                if (op.top() == 0) st.push(y - x);
                else if (op.top() == 1) st.push(y + x);
                else st.push(y ^ x);
                op.pop();
            } op.push(c);
        }
    }
    if (g) st.push(a);
    while (!op.empty()) {
        ll x = st.top(); st.pop();
        ll y = st.top(); st.pop();
        if (op.top() == 0) st.push(y - x);
        else if (op.top() == 1) st.push(y + x);
        else st.push(y ^ x);
        op.pop();
    }
    cout << st.top();
    return 0;
}

b 最小的指数

让我想起了2020ccpc威海的D, 1e18拆成3个1e6

然而这道题不行, T=1e5, 那就大概拆成 1e4 和 1e4~1e18

把1e4内的质数筛出来, 每次先把x, 变成1或者 >1e4 的数

对于剩下的数大于 1e4 的剩下的答案无非是 1,2,3,4

对于2,4, 开两次根号算一下, 对于3, 二分找一下(1e4~1e6), 找不到2,3,4, 那剩下的数必定是个质数 ans = 1

void init() {
    rep (i, 2, 1e4) {
        if (!v[i]) prime[++tot] = i;
        rep (j, 1, tot) {
            if (i * prime[j] > 1e4) break;
            v[i * prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
}
 
bool check(ll n) {
    ll l = 1e4, r = 1e6;
    while (l <= r) {
        ll mid = l + r >> 1, c = mid * mid * mid;
        if (c > n) r = mid - 1;
        else if (c < n) l = mid + 1;
        else return 1;
    }
    return 0;
}
 
int main() {
    IOS; init();
    for (cin >> _; _; --_) {
        ll x; cin >> x;
        if (x == 1) { cout << "0\n"; continue; }
        int ans = 2e9;
        rep (i, 1, tot) {
            int cnt = 0;
            while (x % prime[i] == 0) x /= prime[i], ++cnt;
            if (cnt) umin(ans, cnt);
        }
        if (x >= 1e4) {
            ll a = sqrt(x), b = sqrt(a);
            if (a * a == x) umin(ans, b * b == a ? 4 : 2);
            else if (check(x)) umin(ans, 3);
            else ans = 1;
        }
        cout << ans << '\n';
    }
    return 0;
}

C

dp, 不会

D

hash, 把数字当成进制, 找状态一样的集合就行了

int cnt[N];
ull f[2][N];
vector<pair<ull, ull>> s;

int main() {
    IOS; srand(time(NULL));
    cin >> n >> k; f[0][0] = f[1][0] = 1;
    rep (i, 1, n) f[0][i] = f[0][i - 1] * 131, f[1][i] = f[1][i - 1] * 13331;
    ull a = 0, b = 0; s.pb({ 0 , 0 });
    rep (i, 1, n) {
        cin >> m; a += f[0][m], b += f[1][m], ++cnt[m];
        if (cnt[m] == k) a -= f[0][m] * k, b -= f[1][m] * k, cnt[m] = 0;
        s.pb({ a, b });
    }
    sort(all(s)); ll ans = 0;
    for (int i = 0, j; i < n; i = j) {
        for (j = i + 1; j <= n && s[i] == s[j]; ++j);
        ans += (ll)(j - i) * (j - i - 1) >> 1;
    }
    cout << ans;
    return 0;
}
posted @ 2020-12-16 13:49  洛绫璃  阅读(107)  评论(0编辑  收藏  举报