【CSP试题】202312-1仓库规划、202312-2因子化简

仓库规划

#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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值