Codeforces Round 1079 (Div. 2) A,B,C,D,E1,E2,F题解怎么写?
摘要:A. 友好数字 数学 #枚举 每个测试时间限制1秒 每个测试内存限制256兆字节 对于一个整数 (x),如果另一个整数 (y) 满足以下条件,我们称 (y) 是友好的: (y - d(y) = x),其中 (d(y))
A. 友好数字
数学 #枚举
每个测试时间限制1秒
每个测试内存限制256兆字节
对于一个整数 \(x\),如果另一个整数 \(y\) 满足以下条件,我们称 \(y\) 是友好的:
\(y - d(y) = x\),其中 \(d(y)\) 是 \(y\) 的各位数字之和。
对于给定的整数 \(x\),确定它有多少个友好数字。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 \(t\)(\(1 \leq t \leq 500\))。接下来是测试用例的描述。
每个测试用例由一行组成,包含一个整数 \(x\)(\(1 \leq x \leq 10^9\))。
输出
对于每个测试用例,输出一个整数——问题的答案。
思路
本题上来在草稿纸上列举,很容易想到一个错误的答案:所有\(\% 9==0\)的数
因为枚举\(0\sim 70\)作为\(y\)来打表,发现所有满足的\(x\)都为9的倍数,所以便交了一发。但是实际上这仅仅是必要条件,也就是说,所有\(x\)必然是9的倍数,但是9的倍数不一定是合法的\(x\)
正确的思路应当是尝试枚举接近\(x\)的100个数,因为\(y>x+100\)时\(y-d(y)>x\)
为了更节省时间,只需要枚举接近\(x\)的10个个位为0的数字即可,因为你会发现在\(y\)的个位由0变化到9的过程中\(y-d(y)\)的值是不变的
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
int d(int x) {
int res = 0;
while (x) {
res += x % 10;
x /= 10;
}
return res;
}
void solve() {
int x;cin >> x;
rep(k, x / 10, x / 10 + 10) {
if (10 * k - d(k) == x) {
cout << 10 << '\n';return;
}
}
cout << 0 << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)solve();
}
B. 数组与排列
模拟
每个测试的时间限制为1.5秒
每个测试的内存限制为256 MB
给定一个长度为 \(n\) 的排列 \(p\) 和一个长度为 \(n\) 的数组 \(a\)。
如果数组 \(a\) 可以通过对排列 \(p\) 进行若干次(可能为零次)以下类型的操作得到,那么我们称排列 \(p\) 是数组 \(a\) 的生成排列:
选择一个下标 \(i\) (\(1 \le i < n\))并执行以下两种替换之一:
\(p_i := p_{i+1}\);
\(p_{i+1} := p_i\)。
换句话说,在一次操作中,你可以选择数组中的两个相邻元素,并将其中一个的值复制到另一个。
你需要报告排列 \(p\) 是否是数组 \(a\) 的生成排列。
*长度为 \(n\) 的排列是一个由 \(1\) 到 \(n\) 之间的 \(n\) 个不同整数以任意顺序组成的数组。例如,\([2,3,1,5,4]\) 是一个排列,但 \([1,2,2]\) 不是排列(2 在数组中出现了两次),\([1,3,4]\) 也不是排列(\(n=3\) 但数组中出现了 4)。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 \(t\) (\(1 \le t \le 10^4\))。接下来是测试用例的描述。
每个测试用例的第一行包含一个整数 \(n\) (\(2 \le n \le 2 \cdot 10^5\))——数组和排列的长度。
每个测试用例的第二行包含 \(n\) 个整数 \(p_1, p_2, \dots, p_n\) (\(1 \le p_i \le n\))——排列的元素。
