首页 > 其他分享 >SP12304 题解

SP12304 题解

时间:2023-07-21 16:35:18浏览次数:35  
标签:题解 sum SP12304 枚举 long 因数 flag

原题链接 | 题解链接

本篇题解为此题简单做法较少码量, 并且码风优良, 请放心阅读。

题目简述

当 \(i\) 的所有正因数和 \(=\) \(n\) 时, 其中 \(i\) 的最小值

思路

首先需要完成求一个数的所有正因数之和的函数 \(f(n)\)。 要求此函数可返回传入参数的所有正因数之和, 那么直接遍历 \(1 - n\), 如果当前 \(i\) 是 \(n\) 的因数, 加入计和变量 \(sum\) 中, 最后返回 \(sum\) 的值即可。

示例 :

int f(int n) {
	long long sum = 0;
	for(int i = 1; i <= n; i ++) 
		if(!(n % i)) sum += i;
	return sum;
}

注意 : \(sum\) 要开 \(long long\), 不然可能会爆。

接着在主函数中就可枚举 \(i\), 如果 \(f(i) = n\) 即可输出当前 \(i\), 并停止枚举; 如果当前 \(i > n\), 那么 \(f(i)\) 一定大于 \(n\), 因为 \(i > n\) 而 \(i\) 为 \(i\) 的因数。所以此时就可停止枚举, 并输出 \(-1\)。

具体枚举可参考 :

while(true) {
	sum = f(i ++); // 计算因数和
	if(i - 1 > n) break; // 如果当前 i > n 直接 break
	if(sum == n) {
		flag = true;
		cout << i - 1 << endl; // 满足情况, 输出并 break
		break;
	}
}
if(!flag) cout << "-1\n";

注意 : 当 \(sum = n\) 时, 一定要标记停止枚举

最后只需要注意每组数据处理时, 记得初始化各个变量的值即可。

完整代码如下

#include<iostream>
using namespace std;

long long T, n, sum = 0, num = 1;
bool flag = false;

long long f(long long m) {
	long long summ = 0;
	for(long long i = 1; i <= m; i ++) 
		if(!(m % i)) summ += i;
	return summ;
}

int main() {
	cin >> T;
	while(T --) {
		num = 1, sum = 0, flag = false;
		cin >> n;
		while(true) {
			sum = f(num ++);
			if(num - 1 > n) break;
			if(sum == n) {
				flag = true;
				cout << num - 1 << endl;
				break;
			}
		}
		if(!flag) cout << "-1\n";
	}
	return 0;
}

标签:题解,sum,SP12304,枚举,long,因数,flag
From: https://www.cnblogs.com/So-noSlack/p/17560570.html

相关文章

  • 【补充】时间出错问题解决
    【补充】时间出错问题解决TIME_ZONE='Asia/Shanghai'和USE_TZ=False是Django项目设置中的两个相关选项用于指定项目的时区和是否使用时区。【一】TIME_ZONE='Asia/Shanghai'这个设置用于指定项目所在的时区。在这个例子中,时区被设置为'Asia/Shanghai'表示项目位于......
  • P4843题解
    P4843题解原题连接建模一到比较裸的有源汇上下界最小流。每条边必走一次,要求求出最小的流量。由于比较裸,这里当作上下界流的例题讲。什么是有源汇上下界最小流顾名思义,就是在最大流的基础上增加了边的最小经过流量,使得整个网络可行,并且找出最小流量的方案。一个比较朴实的......
  • 列队春游题解 O(n方)
    题目前言出生镇楼思路:打个暴力先#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;namespaceTestify{inlineintread(){intf(1),x(0);charch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-......
  • 【求助+半题解】BZOJ1461字符串的匹配
    先说思路:因为我们是比对较短的\(B\)与较长的\(A\)的子串,所以我们求不变的\(B\)的\(next\)对于这道题我们可以使用树状数组查询前缀和维护数的排名。对于相同的数我们查询的排名是有误的,因此不仅要比对小于等于该数的前缀和,也要比对小于该数的前缀和。如:对于\(A=2\)\(2\),\(B......
  • claude初步体验1(含个人遇到各种注册问题解决)
    很久之前体验的了,当记录一下吧(于三月)https://www.anthropic.com/claude-in-slack 若出现下面这个,而且你用了魔法还不行,大概率是你之前登录别的工作区,然后被检测出来不在他支持的地区了,然后官方把你禁用了,禁止你IP访问(我之前就是这样子),就是你的源IP,用魔法也不行。解决方法,重启......
  • LG4868 Preprefix sum 题解
    壹、题目大意给出长度为\(n\)的序列\(a_1\sima_n\),设\(S_i=\sum\limits_{j=1}^ia_j\),有两种操作可以给定\(i\)和\(x\),使得\(a_i=x\),也可以给定\(i\),查询\(\sum\limits_{j=1}^iS_j\)的值\(n\le100000\)贰、思路这道题查询的是\(S\),但实际上是\(a\),而操......
  • 题解 POJ3318【Matrix Multiplication】
    postedon2022-10-2119:56:08|under题解|sourceproblem判断三个\(n\timesn\)的矩阵是否满足\(A\timesB=C\),\(n\leq500\)。solution随机一个行向量\(v\)。若\(a\timesb=c\),则有\(v\timesa\timesb=v\timesc\)(不充分)。显然相乘复杂度仅为\(O(n^2)\)。类似于......
  • 题解 P4955 【[USACO14JAN]Cross Country Skiing S】
    postedon2021-02-2710:04:32|under题解|source这道题其实没有绿这么难,只需要二分+搜索就行了。读入。注意尽量不要用scanf读入bool,这好像是UB,可以用一个变量\(x\)存输入的数,然后直接类型转换。二分。套模版就行了,等一下我们再写\(\operatorname{check}()\)函......
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
    发现挨位考虑填哪个不太现实,考虑值域。令\(dp_{i,j,st}\)表示考虑到\(i\),此时序列长度为\(j\),\(i-m\)到\(i-1\)填空状态为\(st\)的方案数,考虑选/不选数即可:\(dp_{i,j,st}\times(\text{popcount}(st)+1)\todp_{i+1,j+1,(2st+1)\&2^m},dp_{i+1,j,(2st)\&2^m}\)乘上那......
  • 题解 //「BZOJ2406」矩阵
    赛时公告现在呢?:现在有弹窗了吗「2023-07-1916:45:07」此时无声胜有声。F.「BZOJ2406」矩阵http://222.180.160.110:1024/contest/3825/problem/7这是头一次见识到把矩阵和网络流结合在一起的题目。不过这种处理方式也是我们在学习二分图时的常客了:把行和列连边表示某一元......