仓库规划
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int a[n][m];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> a[i][j];
// 遍历每个仓库,为其寻找上级仓库
for(int i = 0; i < n; i++)
{
int min = 0; // 初始值默认仓库i没有上级仓库
// 遍历除当前仓库外的所有仓库
for(int j = 0; j < n; j++)
{
if(j == i) continue; // 跳过自身
int state = 1; // 标记变量,初始化为1,表示j是i的上级仓库
// 逐维比较位置编码
for(int k = 0; k < m; k++)
{
// 如果当前仓库在某一维上小于待比较的仓库,则不满足条件
if(a[i][k] < a[j][k])
{
state = 0; // 标记为j不是i的上级仓库
break; // 跳出内层循环,无需继续比较
}
}
// 如果是上级仓库
if(state == 1)
{
min = j+1; // 更新上级仓库的编号
break; // 找到第一个满足条件的上级仓库后就跳出循环
}
}
// 输出找到的上级仓库编号(如果min没有被更新,它将保持为0,即无上级仓库)
cout << min << endl;
}
return 0;
}
因子化简
这里不用专门求素数,因为对于非素数a,它的质因子肯定比它小,所以在遍历到a之前,查询的数x肯定已经去除了a的所有因子,因此x不能被a整除,所以筛选出来的因子一定都是质因子。
比如对于查询数200,我们首先会去除质因子2,查询数就变成了25,显然,25不能被200的因子4、8、10、20等整除。
#include <iostream>
#include <cmath> // 更标准的头文件,虽然 math.h 也行
using namespace std;
int main()
{
int q;
cin >> q;
long long a[q][2]; // 使用二维数组存储每个查询的 x 和 t
for(int i = 0; i < q; i++)
cin >> a[i][0] >> a[i][1];
for(int i = 0; i < q; i++)
{
long long x = a[i][0], result = 1; // x 是当前查询的数,result 用于存储简化后的结果
for(int j = 2; x != 1; j++) // 从2开始,因为最小的素数是2,直到x被分解为1为止
{
if(x % j != 0) continue; // 如果j不是x的因子,则跳过
int y = 0; // y用于记录当前素数j在x中的指数
long long z = 1; // z用于计算j的y次方
while(x % j == 0) // 循环,直到x不能被j整除
{
x /= j; // 去除x中的一个j因子
z *= j; // 累积j的幂次
y++; // 增加指数y
}
if(y >= a[i][1]) // 如果j的指数y大于等于阈值t
{
result *= z; // 将j的y次方加入到结果中
}
// 如果y小于t,则z(即j的y次方)不会被乘到result中,实现了忽略不重要的素因子
}
cout << result << endl; // 输出简化后的结果
}
return 0;
}