电子表格计算与X-因子链问题
电子表格计算 时间限制: 1000 ms 空间限制: 262144 KB
题目描述
实现一个简单的电子表格软件,支持基本的赋值、查询、求和及平均数操作。表格最多有26列(A到Z)和100行(1到100)。每个单元格的位置用字母和数字表示,如C5表示第3列第5行。
操作规则如下:
- 每个操作占一行,可能包含2至4个单词。
- 第一个单词是单元格位置。
- 第二个单词是操作类型:input, output, sum, avg。
- 如果操作类型是input,接下来是一个整数,表示要赋予该单元格的值。
- 如果操作类型是output,输出该单元格当前的值。
- 如果操作类型是sum或avg,接下来两个单词定义了一个矩形区域,该单元格的值为该区域的和或平均数。
输入
第一行输入两个正整数m和n,分别代表表格的列数和行数。第二行输入一个正整数s,表示操作总数。以下s行每行输入一个操作。
输出
对于每个output操作,输出一行结果。
样例输入
3 5
5
A1 input 100
B2 input 200
C3 sum A1 C2
C5 avg B2 C4
C5 output
样例输出
83
数据范围
- 对于30%的数据,m, n, s <= 10。
- 对于100%的数据,m <= 26, n <= 100, s <= 100。
解决方案
使用暴力算法处理每个操作,并在每次操作后更新相关单元格的值。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100;
int grid[27][MAXN + 1];
int main() {
int m, n, s;
cin >> m >> n >> s;
while (s--) {
string op;
char col;
int row, val;
cin >> col >> op;
row = stoi(string(1, getchar()));
if (op == "input") {
cin >> val;
grid[col - 'A'][row] = val;
} else if (op == "output") {
cout << grid[col - 'A'][row] << endl;
} else if (op == "sum" || op == "avg") {
char c1, c2;
int r1, r2;
cin >> c1 >> r1 >> c2 >> r2;
int sum = 0;
for (int i = c1 - 'A'; i <= c2 - 'A'; ++i) {
for (int j = r1; j <= r2; ++j) {
sum += grid[i][j];
}
}
if (op == "avg") {
sum /= (c2 - c1 + 1) * (r2 - r1 + 1);
}
grid[col - 'A'][row] = sum;
}
}
return 0;
}
X-因子链问题 时间限制: 1000 ms 空间限制: 131072 KB
题目描述
给定一个正整数X,找到最长的X-因子链及其数量。X-因子链是指从1开始,每个元素都是前一个元素的整数倍且严格递增,最终达到X。
输出
一行,两个整数,分别表示最大长度和该长度链的数量。
样例输入
100
样例输出
4 6
解决方案
首先找到X的所有质因数,然后计算这些质因数的排列组合。
#include <iostream>
#include <vector>
using namespace std;
vector<int> factors;
unsigned long long factorial[21] = {1};
unsigned long long fact(int n) {
if (factorial[n] != 0) return factorial[n];
return factorial[n] = n * fact(n - 1);
}
void find_factors(int x) {
for (int i = 2; i * i <= x; ++i) {
while (x % i == 0) {
factors.push_back(i);
x /= i;
}
}
if (x > 1) factors.push_back(x);
}
int main() {
int x;
cin >> x;
find_factors(x);
int len = factors.size();
unsigned long long count = fact(len);
for (int i = 2; i <= 20; ++i) {
int cnt = 0;
for (int f : factors) {
if (f == i) cnt++;
}
if (cnt > 1) count /= fact(cnt);
}
cout << len << " " << count << endl;
return 0;
}