蓝桥杯真题 2019第十一届 国赛JavaB组 #E 序列求和 详细题解_学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t ,总是可以找到含-程序员宅基地

技术标签: 算法  蓝桥杯  

E 序列求和

本题总分:15 分


问题描述

学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 St 。
例如 S1 = 1, S2 = 2, S3 = 4, S4 = 6,· · · 。
现在小明想知道,前 60 个 Si 的和是多少?即 S1 + S2 + · · · + S60 是多少?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。







先说一下正确答案吧:292809912969717649(此答案到蓝桥杯官网练习系统提交Accept)

说点什么

网上有看到别人说有两种答案,其实说两种答案的都是错的,客观题只有一个答案,他们会说两种答案是因为他们没有理解好题意,题目说的是“总是可以找到含有 t 个约数的整数”,注意理解“t个”的意思,t个即刚好只能是t个,不能多,不能少。
下面说思路
思路有两种,一种是无脑暴搜,另一种则是用数学公式暴搜


无脑暴搜

先说一下无脑暴搜,这种思路都是很多人最先想到的,我也是。
但是最后发现很难行得通,懒得看这种行不通的思路的请跳到下面第二种思路的讲解

思路:遍历从1到某个很大的数n,在外层循环遍历到n时判断n有多少个因子t,
	即在内层循环里遍历1到根号n(本来应该再次遍历到n,优化一下,把范围缩小根号n
	(跟判断某个数是不是质数一个道理,这里不再赘述,不懂的百度)),
	内层循环遍历完后再更新用来记录答案的数组result[t]

下面代码
#include<stdio.h>
#include<iostream>
#pragma warning(disable:4996)
using namespace std;

bool vis[1000];
long result[1000];
int main(){
    
		int count = 1;
		for (long i = 1; i < 1000000; i++) {
    
			int temp = 0;
			for (int j = 1; j * j <= i; j++) {
    
				if (i % j == 0) {
    
					if (j * j == i) {
    
						temp++;
					} else {
    
						temp += 2;
					}
				}
			}
			if (vis[temp] == false) {
    
				vis[temp] = true;
				result[temp] = i;
				count++;
			}
		}
		for (int i = 1; i < 60; i++) {
    
			printf("%d ", result[i]);
			if (i % 10 == 0) {
    
				printf("\n");
			}
		}

		bool flag = false;
		printf("\n");
		for (int i = 1; i <= 60; i++) {
    
			if (vis[i] == false) {
    
				printf("%d ", i);
				flag = true;
			}
		}
		printf("\n%d", flag);
}

//1 2 4 6 16 12 64 24 36 48
//1024 60 4096 192 144 120 65536 180 262144 240
//576 3072 4194304 360 1296 12288 900 960 0 720
//0 840 9216 196608 5184 1260 0 786432 36864 1680
//0 2880 0 15360 3600 0 0 2520 46656 6480
//589824 61440 0 6300 82944 6720 2359296 0 0
//发现这几个位置的数一直找不到,即使第一个for循环的i已经达到int无法存储的地步:29 31 37 41 43 46 47 53 58 59
//而且随着i的量级的增加,计算耗时已经达到需要估计十几分钟的地步了,这种暴搜也没什么好优化的,只是小小优化,但耗时还是很长




数学公式暴搜

在讲这种思路前需要先跟大家讲一下这个数学公式:

唯一分解定理/算术基本定理
唯一分解定理又称为算数基本定理,基本内容是:

每个大于1的自然数,要么本身就是质数,要么可以写为2个或以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式。

用另一种方法表示就是:

对于任何一个大于1的正整数,都存在一个标准的分解式: N=p1^a1 * p2a2*···*pnan;(其中一系列an为指数,pn为质数)

此定理表明:任何一个大于 1 的正整数都可以表示为素数的积。

有这样几个式子:

F(n)代表任意的正整数n的正因子的数量,则F(n)=(a1+1)(a2+1)(a3+1)······(an+1);

设G(n)代表n的正因子的和,则G(n)=(1+p12+p13+…+p1a1)*(1+p22+p23+…p2a2)(1+pn1+pn2+…+pn^an)=;

详细的这里不说太多,这里只要需要知道:
1.对于任何一个大于1的正整数都可以分解成若干个质数的积。
2.任意的正整数n的正因子数量t是有公式可求的

思路:
1.首先我们得知道我们需要求的是什么:含有 t 个约数的整数n,因题目需要总和最小,
所以这个n需要在所有含有t个约数的数中最小
2.而根据数学公式我们知道任意的正整数n的正因子的数量t=(a1+1)*(a2+1)*(a3+1)*······*(an+1)3.由于n=p1^a1 * p2^a2*···*pn^an;(其中一系列an为指数,pn为质数),为了是n最小,所以应该使指数a1,a2,a3,...,an从最小的开始遍历
4.遍历时利用公式t=(a1+1)*(a2+1)*(a3+1)*······*(an+1)计算每一种a1,a2,a3,..an的组合情况对应的t为多少,此种情况下n(下面代码中的single变量)为多少,是不是应该更新答案
5.遍历完成后即为答案
(补充:理论上是需要遍历a1,a2,a3,a4,a5,a6,a7...an的所有组合情况的,但是题目只要求取前面60个就行,所以遍历a1,a2,a3,a4就够了,且把每一个指数遍历到100(下面代码中的ii变量)也够了)

package 蓝桥杯真题.第十一届.国赛._5_序列求和;

public class Main {
    

	static int testCount=60;//题目要求计算前60个
	static int ii=100;//每个指数遍历的上限
	static long result[]=new long[61];//用了存放前60个的答案
	public static void main(String[] args) {
    

		for (int a4 = 0; a4 <= ii; a4++) {
    
			for (int a3 = 0; a3 <= ii; a3++) {
    
				for (int a2 = 0; a2 <= ii; a2++) {
    
					for (int a1 = 0; a1 <= ii; a1++) {
    
						
						int t=(a1+1)*(a2+1)*(a3+1)*(a4+1);//计算此种指数组合下的t为多少
						if(t<=60) {
    //稍稍优化一下,大于60的题目不要求计算,优化掉
							long single=(long) (Math.pow(2, a1)*Math.pow(3, a2)*Math.pow(5, a3)*Math.pow(7, a4));//计算此种指数组合下的n为多少
//							System.out.println(a1+" "+a2+" "+a3+" "+a4+"     "+t+" "+single);
							if(single<result[t] || result[t]==0) {
    //n需要在所有含有t个约数的数中最小,所有计算结果比之前小才更新答案
								result[t]=single;
							}
						}
					}
				}
			}
		}
		
		long sum=0;
		for (int i = 1; i <= testCount; i++) {
    
			sum+=result[i];
			System.out.print(result[i]+" ");
			if(i%10==0) {
    
				System.out.println();
			}
		}
		System.out.println("\n"+sum);//最终答案,码字不易,觉得有收获记得点赞评论支持一下
	}
}

//1 2 4 6 16 12 64 24 36 48 
//1024 60 4096 192 144 120 65536 180 262144 240 
//576 3072 4194304 360 1296 12288 900 960 268435456 720 
//1073741824 840 9216 196608 5184 1260 68719476736 786432 36864 1680 
//1099511627776 2880 4398046511104 15360 3600 12582912 70368744177664 2520 46656 6480 
//589824 61440 4503599627370496 6300 82944 6720 2359296 805306368 288230376151711744 5040 
//
//292809912969717649
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_54430656/article/details/116431675

智能推荐

torch.mul()——矩阵点乘运算-程序员宅基地

文章浏览阅读1.6w次,点赞30次,收藏50次。torch.mul()torch.mul(input, other, *, out=None)输入:两个张量矩阵;输出:他们的点乘运算结果用途:①实现两个张量矩阵的点乘运算,可以实现广播功能(具体见案例代码)。②实现矩阵的数值乘法(一个常数k与矩阵做乘法,对应于广播机制)注意:若输入的两个矩阵形状不一致,则会通过广播功能进行数据扩充,然后再进行点乘整数矩阵与浮点数矩阵做点乘,结果是浮点数矩阵案例代码:①普通点乘import torch a=torch.tensor([[1,2,_torch.mul

node-sass和sass-loader安装报错_node-sass sass-loader 安装不成功could not find any pyth-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏2次。安装node遇到的相关问题_node-sass sass-loader 安装不成功could not find any python installation to us

Python能干什么,Python的应用领域?_python除在网络运维中应用,还常用在其他哪些领域,请简要说明。-程序员宅基地

文章浏览阅读1.1k次。文章目录前言概括起来,Python 的应用领域主要有如下几个:1.Web应用开发2.自动化运维3.人工智能领域4.网路爬虫5.科学计算6.游戏开发前言Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?Python 的应用领域非常广泛,几乎所有大中型互联网企业都在使用 Python 完成各种各样的任务,例如国外的 Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、阿里、网易、淘宝、知乎、豆瓣、汽车之家、美团等_python除在网络运维中应用,还常用在其他哪些领域,请简要说明。

经典字符串匹配算法——KMP算法_kmp字符串匹配算法-程序员宅基地

文章浏览阅读9k次,点赞40次,收藏88次。KMP算法KMP算法是一种高效的字符串匹配算法,在传统暴力遍历匹配的基础上做了一定的优化。首先KMP算法的实现也是使用了回退思想,不过与暴力遍历不同,KMP的回退,是让子串进行匹配,而不是主串。KMP示例首先我们来看两个例子来理解KMP算法:例1:分别从str的i和sub的j位置处开始匹配:此时a与c不匹配,如果暴力遍历的话,是i回到到b,j也回到a,重新一轮匹配。而KMP算法,是将子串的j回到第二个a,str[i]与sub[j]重新开始匹配。原因很明显,第二个ab与第一个ab是相同的,因_kmp字符串匹配算法

3分钟快速presentation-程序员宅基地

文章浏览阅读1.2k次。来自英语课的一个练习:https://www.youtube.com/watch?v=ePY3uY1L0X0 next up I'd like to welcome Joshua to ten he's from the ANU College of Medicine biology and the environmentand the title of his three-mi..._3 minute presentation

6_分布式训练框架Horovod使用(20190111)_horovod的用法-程序员宅基地

文章浏览阅读6.7k次,点赞5次,收藏25次。分布式训练框架Horovod使用文章目录一、Horovod简介二、Horovod框架的安装 Install1、安装OpenMPI2、安装Horovod三、Horovod框架的使用由于近期需要提高网络训练的速度,所以去找了一条捷径,想走快点,就找到了Horovod框架,对TensorFlow搭建的网络训练提速特别有效,好吧,让我们一起开启愉快的Horovod之旅吧. Oh, no 是痛苦的Ho..._horovod的用法

随便推点

Gradle常用命令和原理说明_android gradlew clean 的作用-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏5次。Gradle 是基于groovy语言实现(基于JVM的语法和java类似的脚本语言)的一个Android编译系统, google针对Android编译用groovy语言开发了一套dsl,这就是gradle。 因此,遇到不明白的gradle配置,直接看看相关groovy的源码,一般都可以找到解决的办法,始终记住,groovy是类似java的编程语言,不仅仅是脚本语言。在现在流行的Spring Boot微服务开发框架中,Groovy语言是可以代替Java语言编程的。_android gradlew clean 的作用

linux下安装 mysql后开启远程连接和配置防火墙开放3306端口_linux8 mysql 开放3306-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。此方法不需要修改配置文件就可以一劳永逸1.开放远程连接先进入msql数据库,然后输入以下命令: use mysql update user set user.Host='%' where user.User='root'; flush privileges;你也可以指定IP访问:grant all privileges on *.* to 'root'@'192.168.1.%' identified by 'password' with grant optio..._linux8 mysql 开放3306

Access denied for user root @ localhost (using password: YES)_idea运行项目时access denied for user 'root'@'localhost'-程序员宅基地

文章浏览阅读1.4w次,点赞20次,收藏220次。Access denied for user root @ localhost (using password: YES)_idea运行项目时access denied for user 'root'@'localhost' (using password: yes

Unity光照烘培_unity 光照烘焙参数设置-程序员宅基地

文章浏览阅读1.3k次。Unity光照烘培参数详解_unity 光照烘焙参数设置

System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试_system.net.sockets.socketexception:“以一种访问权限不允许的方式做-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏3次。可能导致问题的两种情况:1、编译软件没有获取到访问权限;解决办法:以“管理员身份”重新打开编译软件;2、访问的端口被占用;解决办法:1)点击菜单下的"运行",输入"cmd",来到控制台;2)输入"netstat -a"查看端口是否被占用;3)如果发现应用程序中所使用的端口已被占用,更改应用程序的端口,问题解决。参考:https://www.cnblogs.com/darrenji/p/4629545.html..._system.net.sockets.socketexception:“以一种访问权限不允许的方式做了一个访问

yolov3-tiny训练自己的数据集-程序员宅基地

文章浏览阅读2.9k次,点赞6次,收藏52次。yolov3制作并训练自己的VOC数据集一、制作VOC数据集你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高_yolov3-tiny训练自己的数据集

推荐文章

热门文章

相关标签