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\))——排列的元素。
阅读全文