AtCoder Beginner Contest 156

比赛链接:https://atcoder.jp/contests/abc156

A - Beginner

题意

如果 $n<10$,输出 $r+100\times(10-n)$,否则输出 $r$ 。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, r; cin >> n >> r;
    cout << r + 100 * max(0, 10 - n);
}

B - Digits

题意

计算 $n$ 在 $k$ 进制下的位数。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, k; cin >> n >> k;
    int cnt = 0;
    while (n) 
        n /= k, ++cnt;
    cout << cnt;
}

C - Rally

题意

数轴上有 $n$ 个人,将一个人从点 $x$ 移到 $p$ 的花费为 $(x-p)^2$,计算将所有人移到同一点的最小花费。$(1≤n≤100,1≤x≤100)$

题解

依次枚举端点即可。

不能枚举每个人的位置:如 $1,3$,此时移动到不是任何人的位置的 $2$ 是最优的。

不能枚举平均值:如 $1,1,1,1,1,3$,此时移动到不为平均值 $2$ 的 $1$ 是最优的。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    int x[n] = {};
    for (int i = 0; i < n; i++)
        cin >> x[i];
    int ans = INT_MAX;
    for (int p = 1; p <= 100; p++) {
        int sum = 0;
        for (int i = 0; i < n; i++)
            sum += (x[i] - p) * (x[i] - p);
        ans = min(ans, sum);
    }
    cout << ans << "\n";
}

D - Bouquet

题意

有 $n$ 朵不同的花,要求所用花的数量不能为 $a$ 或 $b$,计算可以组成多少不同的花束。

题解

用 $1$ 朵花的花束个数:$C_n^1$

用 $2$ 朵花的花束个数:$C_n^2$

用 $3$ 朵花的花束个数:$C_n^3$

……

用 $n$ 朵花的花束个数:$C_n^n$

即,$ans = 2^n - C_n^a - C_n^b - C_n^0$

代码

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int mod = 1e9 + 7;

ll fpow(ll a, ll b) {
    ll res = 1;
    while (b > 0) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

ll inv(ll x) {
    return fpow(x, mod - 2);
}

ll C(ll n, ll m) {
    ll res = 1;
    ll mi = min(m, n - m);
    for (int i = 1; i <= mi; i++)
        res = res * (n - i + 1) % mod * inv(i) % mod;
    return res;
}

int main() {
    ll n, a, b; cin >> n >> a >> b;
    cout << (fpow(2, n) - C(n, a) - C(n, b) - 1 + mod + mod) % mod;
}

 

posted @ 2020-05-23 23:30  Kanoon  阅读(216)  评论(0)    收藏  举报