牛客周赛60
A 困难数学题
直接输出 0 即可。
B 构造序列
void solve() {
int n, m;cin >> n >> m;
int x = min(n, m);
cout << x + (n == m ? x : x + 1) << '\n';
}
C 连点成线
小红有一个
对于一对棋子
小红有点无聊,于是她把能连的线都连上了。现在,她想知道,最长的那条线,长度是多少。
特别地,如果连线数量为
void solve() {
int n, m;cin >> n >> m;
vector<pair<int, int>> a(m + 1);
for (int i = 1;i <= m;i++)cin >> a[i].first >> a[i].second;
sort(a.begin() + 1, a.end(), [](auto x, auto y) {
if (x.first == y.first)return x.second < y.second;
return x.first < y.first;
});
map<int, int> mp;
int ans = 0;
for (int i = 1;i <= m;i++) {
auto [x, y] = a[i];
if (!mp.count(x)) {
mp[x] = y;
} else {
ans = max(ans, y - mp[x]);
}
}
mp.clear();
for (int i = 1;i <= m;i++) {
auto [x, y] = a[i];
if (!mp.count(y)) {
mp[y] = x;
} else {
ans = max(ans, x - mp[y]);
}
}
cout << ans << '\n';
}
D 我们 N 个真是太厉害了
这天,
小小歪吹牛到,从我们几个人中挑出几个来,手里的小星星数量全部加起来,可以表示出
小小龙认为小歪错了,但是他是小朋友,他不会计算。
所以小小龙来求助你,他想让你找到最小的整数证明小小歪是错误的。
Solution
DP 的思想
bitset 优化 01 背包(和之前 swpuOj 里面的散兵几乎一样)
时间复杂度:
void solve() {
int n;cin >> n;
vector<int> a(n + 1);
for (int i = 1;i <= n;i++)cin >> a[i];
bitset<100010> b;
b[0] = 1;
for (int i = 1;i <= n;i++) {
b |= (b << a[i]);
}
for (int i = 1;i <= n;i++) {
if (!b[i]) {
cout << i << '\n';return;
}
}
cout << "Cool!\n";
}
若已经能组成
条件:
void solve() {
int n;cin >> n;
vector<int> a(n + 1);
for (int i = 1;i <= n;i++)cin >> a[i];
sort(a.begin() + 1, a.end());
int x = 0;
for (int i = 1;i <= n;i++) {
if (a[i] > x + 1 && x < n) {
cout << x + 1 << '\n';return;
}
x += a[i];
}
cout << "Cool!\n";
}
E 折返跑
Solution
实际上是要在
1931(925div3):组合数学的复习
相当于一共有
个球分别放入 个盒子中(每个盒子至少有一个球)。即
即答案是
时间复杂度是
引入一个
所以:
即有
时间复杂度
考虑组合数的性质,我们知道:
利用这个性质,将原等式视为累加,从而它等价于:
从而,这个和可以被重新组合并逐渐结合利用 Pascal’s 恒等式化简到:
这个是给定组合的性质。从组合意义上来讲,右边的组合数
综上所述,这个等式成立。
void solve() {
int n, m;cin >> n >> m;
cout << C(n - 2, m - 1) << '\n';
}
F 口吃
讲到第
讲到第
讲到第
直到讲话完毕,
Solution
设
有
将
void solve() {
int n;cin >> n;
vector<int> p(n), q(n), e(n);
for (int i = 1;i < n;i++)cin >> p[i];
for (int i = 1;i < n;i++)cin >> q[i];
e[0] = 1;e[1] = (p[1] + q[1]) * inv(p[1]) % mod;
for (int i = 2;i < n;i++) {
e[i] = (q[i] * q[i] % mod * e[i - 1] % mod + (p[i] + q[i]) * (p[i] + q[i]) % mod) % mod * inv(p[i]) % mod * inv(p[i]) % mod;
}
int ans = 0;
for (int i = 0;i < n;i++) {
ans += e[i];ans %= mod;
}
cout << ans << '\n';
}
官方题解:
设
所以可以直接推
处理完所有的
#define int long long
constexpr int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<int> p(n), q(n);
for (int i = 1;i < n;i++)cin >> p[i];
for (int i = 1;i < n;i++)cin >> q[i];
int P = 1, Q = (p[1] + q[1]) * inv(p[1]) % mod;
p[1] = P, q[1] = Q;
for (int i = 2;i < n;i++) {
int a = p[i], b = q[i];
int mu = (((a * a % mod + b * b % mod) % mod - b * b % mod * P % mod) + mod) % mod;
P = a * a % mod * inv(mu) % mod;
Q = (Q * b % mod * b % mod + (a + b) * (a + b) % mod) % mod * inv(mu) % mod;
p[i] = P, q[i] = Q;
}
vector<int> f(n + 1);
f[n] = 1;
for (int i = n - 1;i >= 1;i--) {
f[i] = p[i] * f[i + 1] % mod + q[i];f[i] %= mod;
}
cout << f[1] << '\n';
}