Project_Euler-24 题解

Project_Euler-24 题解

标题

题目

1
2

思路

如果是用笔算的话,可以找到这样的规律:

对于下面的这个组合:

0123456789 {0123456789} 0123456789

我们将其看作一种排列情况,然后我们先使用微扰的方式更改变动一下其中的数值,具体这样来做:

根据字典序的顺序,我们让他变动4次,记录每次变换的规律:

1:
01234567 9 8 01234567\textcolor {red}{9}8 0123456798

0123456 8 79 0123456\textcolor {red}{8}79 0123456879

0123456897 0123456897 0123456897

0123456 9 78 0123456\textcolor {red}{9}78 0123456978

发现一个这样的规律,越高位的数字,越难变动。最后一位数字每次都会变动,肯定是存在规律在其中的。

具体是什么样的规律呢?

假设一共有 N N N 位,如果我们想让倒数第 K K K 位增加1,那么从 K + 1 K + 1 K+1~ N N N位的数字位数都需要变换一遍,如果我们一位一位的确定,那么总共有如下的可能性:

C N − K 1 ∗ C N − K − 1 1 ∗ C N − K − 2 1 . . . C 1 1 C_{N-K}^{1} * C_{N-K-1}^{1}*C_{N-K-2}^{1}...C_{1}^{1} CNK1CNK11CNK21...C11

例如:$012,
如果我们想让最高位变动,那么就需要 C 3 − 1 1 ∗ C 3 − 2 1 = C 2 1 ∗ C 1 1 = 2 ∗ 1 = 2 C_{3-1}^{1}*C_{3-2}^{1} = C_{2}^{1}*C_{1}^1{} = 2 * 1 = 2 C311C321=C21C11=21=2 次变动。

最终我们发现,如果想让第 K K K 位按照字典序变动一次,那么就需要让后面所有位变动 ( N − K ) ! (N-K)! (NK)!位。

根据这个特点,我们可以判断出对于 0123456789 0123456789 0123456789 这串数列每一位想要变动时,后面需要变动的次数。

他们分别是:

9 ! , 8 ! , 7 ! , 6 ! , 5 ! , 4 ! , 3 ! , 2 ! , 1 ! , 0 {9!,8!,7!,6!,5!,4!,3!,2!,1!,0} 9!,8!,7!,6!,5!,4!,3!,2!,1!,0

现在题目想让我们求出第一百万位的的排列是什么,由于 0123456789 0123456789 0123456789 是第一种情况,因此我们实际需要变动 999999 999999 999999 次,我们可以通过上面的方式从最高位开始往后确定。

每一位应当尽可能的变化:

例如第一位, 9 ! = 352880 9! = 352880 9!=352880 所以可以让其变换 2 2 2 次,第一位的值就等于 2 2 2,此时 999999 − 2 ∗ 9 ! = 999999 − 725760 = 274239 999999 - 2 * 9! = 999999 - 725760 = 274239 99999929!=999999725760=274239;

第二位, 8 ! = 40320 8! = 40320 8!=40320,可以让其变换 6 6 6 次,第二位的值就等于 6 6 6, 此时 274239 − 6 ∗ 8 ! = 32319 274239 - 6 * 8! = 32319 27423968!=32319

依次类推。

值得一提的是,对于每一位变换的时候,初始值应该是多少呢?我们可以开辟一个数组,对每一位进行标记,如果使用了,就记为1,每用过就记为0,在变换时,我们从0开始,如果这个值被用过,那么向后跳一位,但是不计入变换次数。

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define MAX_N 10

// jump用来记录1到9的阶乘
int jump[MAX_N + 5];
// 用于标记哪些数字没被使用过, 1表示没被使用,0表示使用过了
int empty_num[MAX_N + 5];

// 初始化函数,计算阶乘,初始化empty_num数组
void init() {
    jump[0] = 1, empty_num[0] = 1;
    for (int i = 1; i <= MAX_N; i++) {
        jump[i] = jump[i - 1] * i;
        empty_num[i] = 1;
    }
    return ;
}

// 这个函数返回在需要变换k次时,第n位的值应该是多少。
int get_num(int n, int k) {
	// ind记录应该变化的位数,i表示从-1开始
    int ind = (k / jump[n]) + 1, i = -1;
    while(ind) {
    	// i先加,从0开始判断
        i++;
        // 被用过的数字不会对ind造成影响
        ind -= empty_num[i];
    }
    // 标记使用过
    empty_num[i] = 0;
    return i;
}

int main() {
    init();
    int n, k;
    // n表示需要判断的位数,k表示要求的排列这里应该是一百万。
    scanf("%d %d", &n, &k);
    k -= 1;
    // 从最高位开始判断
    for (int i = n - 1; i >= 0; --i) {
        int num = get_num(i, k);
        printf("%d", num);
        k %= jump[i];
    }
    printf("\n");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL Developer 小贴士:PL/SQL语法分析

对于SQL或PL/SQL中的语法错误和警告&#xff0c;SQL Developer可以用不同颜色的下划波浪线显示。 启用语法分析&#xff0c;可以用菜单Tool>Preferences>Code Editor>Completion Insight>Enable Semantic Analysis Info Tips 例如&#xff0c;以下的代码中&…

linux系统---安装使用nginx

目录 一、编译安装Nginx 1、关闭防火墙&#xff0c;将安装nginx所需要软件包传到/opt目录下 ​编辑2、安装依赖包 3、创建运行用户、组 4、编译安装nginx 5、创建软链接后直接nginx启动 ​编辑 6、创建nginx自启动文件 ​编辑6.1 重新加载配置、设置开机自启并开启服务…

【开源】JAVA+Vue.js实现大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

多线程基础说明【基础篇】

目录 &#x1f32d;1.相关概念 &#x1f37f;2.创建和启动线程 &#x1f95e;3.线程安全 &#x1f9c8;4.死锁 &#x1f953;5.线程通信的方法 1.相关概念 1.1程序 为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象…

数据结构二叉树顺序结构——堆的实现

二叉树顺序结构——堆的实现 结构体的创建以及接口函数结构体的创建堆的初始化交换函数堆的插入向上调整删除向下调整返回堆的个数返回堆顶数据判断堆是否为空 该文章以大堆作为研究对象 结构体的创建以及接口函数 typedef int HPDateType;//定义动态数组的数据类型 typedef s…

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

Oracle ADG相关介绍

文章目录 一、ADG原理1、ADG介绍2、ADG搭建流程 二、ADG相关参数三、增量修复 一、ADG原理 1、ADG介绍 Oracle ADG&#xff08;Advanced Data Guard&#xff09;是Oracle数据库的一项高可用和灾难恢复技术&#xff0c;它通过将数据保持在物理备库中来提供数据保护和容灾能力。…

Odoo系统安装部署并结合内网穿透实现固定域名访问本地ERP系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…

Python爬虫-付费代理推荐和使用

付费代理的使用 相对免费代理来说&#xff0c;付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类&#xff1a; 一类提供接口获取海量代理&#xff0c;按天或者按量收费&#xff0c;如讯代理。 一类搭建了代理隧道&#xff0…

一元函数微分学——刷题(22

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 由于是极坐标方程&#xff0c;所以这个式子一定成立&#xff1a; 然后代入r即可变为参数方程的求导&#xff1a; 3.总结&#xff…

52.仿简道云公式函数实战-文本函数-LEFT

1. LEFT函数 从一个文本字符串的第一个字符开始返回指定个数的字符。 2. 函数用法 LEFT(text,[num_chars]) 3. 函数示例 从一个文本字符串的第一个字符开始返回指定个数的字符。 4. 代码实战 首先我们在function包下创建text包&#xff0c;在text包下创建LeftFunction类…

POST参数里加号+变成空格的问题处理

今天遇到个这样的问题&#xff0c;从前端传到后端的加密报文&#xff0c;里面包含了号&#xff0c;但在后端日志输出看出&#xff0c;变成空格。这个是由于经过RSA加密后引起的 解决办法&#xff1a; 1.前端转码&#xff1a;使用encodeURIComponent对参数进行转码 2.后端解码…

msvcp110.dll找不到的处理方法,一键修复msvcp110.dll文件

如果你遭遇到了“msvcp110.dll文件丢失”的现象&#xff0c;那就要引起足够的重视&#xff0c;因为这通常意味着你的电脑上某些依赖此DLL文件的应用程序将无法正常启动。msvcp110.dll是许多软件中必须的组件&#xff0c;一旦发生丢失&#xff0c;影响的不仅是单个程序&#xff…

Java SpringBoot 整合 MyBatis 小案例

Java SpringBoot 整合 MyBatis 小案例 基础配置&#xff08;注意版本号&#xff0c;容易报错&#xff09; pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

武汉灰京文化:中国手游行业新技术的涌现与产业链的完善

中国手游行业正迎来新技术的涌现&#xff0c;如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能&#xff08;AI&#xff09;。这些技术为游戏提供了全新的可能性&#xff0c;扩展了游戏的玩法和体验。例如&#xff0c;VR技术可以让玩家沉浸…

卖家横扫海外露营市场的机会来了,赛盈分销预测2024年消费者新需求

甲辰龙年开篇&#xff0c;就要迎来国外野营浪潮了&#xff0c;希望点开这篇推送的你&#xff0c;红红火火、热辣滚烫一整年。每年的3月份&#xff0c;海外用户对露营设备的搜索开始迅速增长。今天和大家聊聊露营市场出海的一些布局方向。 全球露营商品的市场规模愈发壮大&#…

Maven jar 的查找及依赖版本确定

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

再次委托|工科背景老师赴美国斯坦福大学自费访学

工科背景的I老师&#xff0c;几年前曾通过我们获得美国哈佛大学医学院的无薪博士后职位&#xff0c;从事医工交叉学科研究。回国完成2年服务期后&#xff0c;I老师再次委托并仍希望去美国顶尖高校&#xff0c;最终我们落实了世界名校斯坦福大学的访问学者职位&#xff0c;满足了…

微信小程序自制动态导航栏

写在前面 关于微信小程序导航栏的问题以及解决办法我已经在先前的文章中有提到&#xff0c;点击下面的链接即可跳转~ &#x1f90f;微信小程序自定义的导航栏&#x1f90f; 在这篇文章中我们需要做一个这样的导航栏&#xff01;先上效果图 &#x1f447;&#x1f447;&#x1f…