牛客挑战赛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;
}