1512 G. Short Task

https://codeforces.com/contest/1512/problem/G

在这里插入图片描述
就是求这么一个式子,即一个数的因子和。对每个数进行暴力找因子求解的话肯定会T,这里有个巧妙的方法,如图:

//求1-n每个数的因子和
	for (int i = 1; i <=n; i++)
		for (int j = i; j <=n; j += i)
			sum[j] += i;

因为因子就是能够整除的数,所以对于每个j来说,i一定是它的因子,那么我们枚举一遍i,对于每个i再枚举一遍它的倍数,累加起来就能求出1-n的因子和了,这样的时间复杂度nlogn,不会T。
接下来就很简单了,存一个答案数组记录下来即可,这里要注意题目要求的是最小值,所以我们只需要在对应的答案数组为0时更新一次即可。

#include <bits/stdc++.h>
using namespace std;
#define qc ios::sync_with_stdio(0)
#define ll long long
#define pb push_back
#define n 1000001
int sum[n];
int ans[n];

int main() {
	qc, cin.tie(0);
	for (int i = 1; i < n; i++)
		for (int j = i; j < n; j += i)
			sum[j] += i;
	for (int i = 1; i < n; i++)
		if (sum[i] < n)
			if (ans[sum[i]] == 0)
				ans[sum[i]] = i;
	int t;
	cin >> t;
	while (t--) {
		int x;
		cin >> x;
		if (ans[x] == 0)
			ans[x] = -1;
		cout << ans[x] << "\n";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值