AtCoder Beginner Contest 169
比赛链接:https://atcoder.jp/contests/abc169/tasks
A - Multiplication 1
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b; cin >> a >> b;
cout << a * b << "\n";
}
B - Multiplication 2
题意
计算 $a_1 \times a_2 \times ... \times a_n$ 。($2≤n≤10^5, 0≤ a_i ≤ 10^{18}$)
题解一
若 $ans$ 乘以某个 $a_i$ 大于 $10^{18}$ 则溢出,即:
$ans \times a_i > 10^{18}$,
为避免运算过程中乘积溢出,移项得:$a_i > \frac{10^{18}}{ans}$ 。
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const ll MAXN = 1e18;
int main() {
int n; cin >> n;
ll a[n] = {};
for (int i = 0; i < n; i++)
cin >> a[i];
if (count(a, a + n, 0)) {
cout << 0 << "\n";
return 0;
}
ll ans = 1;
for (int i = 0; i < n; i++) {
if (a[i] > MAXN / ans) {
cout << -1 << "\n";
return 0;
}
ans *= a[i];
}
cout << ans << "\n";
}
题解二
转化为 __int128 可以避免溢出。
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const ll MAXN = 1e18;
int main() {
int n; cin >> n;
ll a[n] = {};
for (int i = 0; i < n; i++)
cin >> a[i];
if (count(a, a + n, 0)) {
cout << 0 << "\n";
return 0;
}
ll ans = 1;
for (int i = 0; i < n; i++) {
if ((__int128)ans * a[i] > MAXN) {
cout << -1 << "\n";
return 0;
}
ans *= a[i];
}
cout << ans << "\n";
}
题解三
如果能由下一个积除以 $a_i$ 得到现在的积说明不会发生溢出,但是这个方法需要用 $unsigned\ long\ long$ 才行。
代码
#include <bits/stdc++.h>
using ull = unsigned long long;
using namespace std;
const ull MAXN = 1e18;
int main() {
int n; cin >> n;
ull a[n] = {};
for (int i = 0; i < n; i++)
cin >> a[i];
if (count(a, a + n, 0)) {
cout << 0 << "\n";
return 0;
}
ull ans = 1;
for (int i = 0; i < n; i++) {
ull next = ans * a[i];
if (next / a[i] != ans or next > MAXN) {
cout << -1 << "\n";
return 0;
}
ans *= a[i];
}
cout << ans << "\n";
}
题解四
使用 python 中自带的大数运算。
代码
def main():
N = int(input())
A = list(map(int, input().split())) if 0 in A:
print(0)
return ans = 1
for a in A:
ans *= a
if ans > int(1e18):
print(-1)
return print(ans) main()
C - Multiplication 3
题意
$a$ 为整数,$b$ 为保留小数点后两位的小数,计算 $a \times b$ 。($0≤a≤10^{15}, 0≤ b < 10$)
题解
把 $b$ 转化为整数再计算。
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int main() {
ll a; string s; cin >> a >> s;
s.erase(1, 1);
ll b = stoll(s);
cout << a * b / 100;
}
D - Div Game
题意
给出一个正整数 $n$,每次操作可以选择一个正整数 $z$,要求:
- $z = p^e$,$p$ 为正素数,$e$ 为正数
- $z$ 整除 $n$
- $z$ 不同于任一之前选择的 $z$
- 如果以上条件满足,$n = \frac{n}{z}$
找出最多可以进行多少次操作。
题解
找出每个质因数的个数,依次减去 $1,2,3...$ 即可。
代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int main() {
ll n; cin >> n;
map<ll, ll> mp;
for (ll i = 2; i * i <= n; i++) {
while (n % i == 0) {
++mp[i];
n /= i;
}
}
if (n != 1) ++mp[n];
ll ans = 0;
for (auto i : mp) {
for (int j = 1; j <= i.second; j++) {
i.second -= j;
++ans;
}
}
cout << ans << "\n";
}
E - Count Median
题意
有 $n$ 个数 $x_1,x_2,...,x_n$,$a_i≤x_i≤b_i$,找出中值 $x_{mid}$ 可能的值的个数。
- 中值为将所有 $x_i$ 排序,位于中间的 $x_i$
- 如果 $n$ 为奇数,中值为 $x_{(n+1)/2}$
- 如果 $n$ 为偶数,中值为 $(x_{n/2} + x_{n/2 + 1}) / 2$
题解
中值的最小值为 $a_i$ 的中值,最大值为 $b_i$ 的中值,中值的个数即:$b_{mid} - a_{mid} + 1$ 。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n;
int a[n] = {}, b[n] = {};
for (int i = 0; i < n; i++)
cin >> a[i] >> b[i];
sort(a, a + n);
sort(b, b + n);
int mi = 0, mx = 0;
if (n & 1) {
mi = a[n / 2];
mx = b[n / 2];
} else {
mi = a[n / 2 - 1] + a[n / 2];
mx = b[n / 2 - 1] + b[n / 2];
}
cout << mx - mi + 1;
}
F - Knapsack for All Subsets
题意
有 $n$ 个数 $a_1,a_2,...,a_n$,计算 ${1,2,...,n}$ 的 $2^n - 1$ 个非空子集有多少子集作为下标求和可以得到 $s$ 。
题解
$dp_i$ 表示和为 $i$ 的集合共有多少个。
每次添加一个数 $x$,会产生两种变化:
- $x$ 与 $dp_i$ 中的每个集合构成的新集合都可以构成 $i + x$:$dp_{i + x}\ +=\ dp_i$
- $x$ 与 $dp_i$ 中的每个集合构成了一个包含原先集合的新集合:$dp_i\ *=\ 2$
代码
#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int dp[6010];
int main() {
int n, s; cin >> n >> s;
dp[0] = 1;
for (int i = 0; i < n; i++) {
int x; cin >> x;
for (int j = s; j >= 0; j--) {
(dp[j + x] += dp[j]) %= mod;
(dp[j] *= 2) %= mod;
}
}
cout << dp[s] << "\n";
}
AtCoder Beginner Contest 169的更多相关文章
- AtCoder Beginner Contest 169 题解
AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
随机推荐
- unixbench性能测试跑分工具
UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能 所谓跑分工具,不仅各项的测试有得分,最后跑完也会有一个综合 ...
- SDUST数据结构 - chap5 数组与广义表
选择题:
- 使用.net中的API网关模式封装微服务
在本文中,我们将了解如何使用API网关模式来封装微服务并抽象出底层实现细节,从而允许使用者拥有进入我们系统的一致入口点. 为了构建和测试我们的应用程序,我们需要: 1.Visual Studio 20 ...
- Java中的深浅拷贝问题,你清楚吗?
一.前言 拷贝这个词想必大家都很熟悉,在工作中经常需要拷贝一份文件作为副本.拷贝的好处也很明显,相较于新建来说,可以节省很大的工作量.在Java中,同样存在拷贝这个概念,拷贝的意义也是可以节省创建对象 ...
- 理解Go的多态实现
总结两点: 在Go中,定义一个interface类型,该类型说明了它有哪些方法.使用时,在函数中,将该interface类型作为函数的形参,任意一个实现了interface类型的实参都能作为该inte ...
- 电脑微信电脑PC 多开/防撤回 补丁
简介 经常使用微信电脑版的用户都会发现一个蛋疼的事情,那就是微信PC版不支持多开,也就是不能同时登陆多个账号,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便.另外有的时候别人撤回了一些 ...
- VMware虚拟机提示“以独占方式锁定此配置文件失败”!!!
VMware异常关闭后再次启动提示"以独占方式锁定此配置文件失败"!!! 前几日在使用VMware虚拟机的时候,虚拟机突然出现了卡顿,然后就把电脑关机了重启,结果再次打开虚拟机的时 ...
- E2.在shell中正确退出当前表达式
E2.在shell中正确退出当前表达式 优雅退出当前表达式 在shell里面输出复杂的多行表达时,经常由于少输入一个引号,一直无法退出当前的表达式求值,也没有办法终止它,以前只能通过两次Ctrl+C结 ...
- TCP/IP中的Payload概念以及由此引申出的一些问题
TCP报文一次性最大运输的货物量(Payload),大体可以这么来计算: IP报文头长度 + TCP报文头长度 + Payload长度 ≤ MTU 即左边的三者之和,要小于等于右边MTU的长 ...
- 洛谷P2145
Description 给定一串数字,每个数字代表一种颜色 你可以向这个数字序列里加任意数字,每加一个视为一次操作 当你加入的数字和与它相连的同种数字不少于三个时,他们就会消除 消除后序列的两端自动靠 ...