[算法][排列/剪枝]带分数

news/2025/3/9 21:19:57/文章来源:https://www.cnblogs.com/zoom-liang/p/18761405

带分数

100 可以表示为带分数的形式:100=3+69258714

还可以表示为:100=82+3546/197

注意特征:带分数中,数字 1∼9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式

一个正整数。

输出格式

输出输入数字用数码 1∼9不重复不遗漏地组成带分数表示的全部种数。

数据范围

1≤N<10^6

输入样例1:

100

输出样例1:

11

输入样例2:

105

输出样例2:

6

N = a + b/c

(1~9)进行全排列

分割成a|b|c

a的长度必然小于等于N

遍历 a <= len(N)的部分

如何推导b的末位

每次循环里 N - a的值可以得到,所以现在需要求 b 和 c

因为 N = a + b/c 即 b = (N - a) * c

对于每一个切割好的分组 c的最后一位是确定的

b的末位 = (N - a) * c的末位 % 10 (得到的余数)

e.g. : N=100 a=3 遍历到c[-1]=4

97*4=388 %10 = 8

即可以推出b的末位

分割排列为 a(前al+1位) b(中间部分) c(剩余部分)

检查b是否被c整除且满足N=a+b/c

from itertools import *
n = int(input())
bit = len(str(n))   # n的位数 
cnt = 0
for num in permutations("123456789"):print(num)a, b, c = 0, 0, 0for al in range(bit):          # al: a的位数,a<=na = int("".join(num[:al+1]))   # 一个abLast = (n - a) * int(num[-1]) % 10  # b的尾数,(n-a)c%10if bLast == 0: continue              # b的尾数不可能等于0,因为只用到1~9bl = num.index(str(bLast))        # 根据b的尾数,确定b的长度if bl <= al or bl >= 8: continue    # b的末位位置不会在a的位数前面,也不会在第8,9位b = int("".join(num[al+1:bl+1]))c = int("".join(num[bl+1:]))if b % c == 0 and n == a + b // c:   # 判断是否符合条件,//:整数除法cnt += 1
print(cnt)

灵感来源:带分数-python

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle VM VirtualBox Ubuntu 桥接模式下 固定虚拟机的 ip

Ubuntu版本: Ubuntu server:22.04.5 LTS 注意:网上找了很多版本,都是相似的去编辑 /etc/netplan/ 下的 xx-cloud-init.yaml 文件,但是配置文件中,有一段提示需要注意此文件是自动生成的,每次开机都会重新生成,所以直接编辑,将不起作用,需要按提示 添加 /etc/cloud/cl…

AtCoder Beginner Contest 396-G - Flip Row or Col

https://atcoder.jp/contests/abc396/tasks/abc396_g 下面给出题目的中文思路、详细解释以及带中文注释的 C++ 实现代码。代码实现 下面给出带中文注释的 C++ 代码: #include <bits/stdc++.h> using namespace std;typedef long long ll;// 快速Walsh-Hadamard变换(FWH…

DVWA-CSRF-Low

1.更改密码并使用BP抓包2.将抓到的数据包发送到重放模块,删除referer 内容,密码成功更改;referer不影响数据包请求结果,判断存在漏洞3.构造下面的index.html文件,其中的链接为更改密码链接 <!DOCTYPE html> <html lang="en"> <head><meta …

UE5之重定向Mixamo动画

首先将下载的fbx格式的角色导入UE5中,得到角色的骨骼,网格体,物理资产等,然后将fbx格式的动画也导入到UE中,选择刚刚导入的骨骼。 然后右键 动画---IK绑定---IK绑定,新建两个IK绑定Epic和Archer,分别选择刚刚导入的骨骼以及需要重定向的目标骨骼。在两处骨骼的头,左右手…

p44太阳花

from turtle import * color(red, yellow) begin_fill() while Ture:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序for i=1:Lekf-1z =…

Winform控件命名规则

C#控件命名规范控件分类控件名称命名规范说明数据显示控件DataGridViewdgv 数据绑定和定位控件BindingSourcebds BindingNavigatorbdn 文本编辑控件TextBoxtxt RichTextBoxrtxt MaskedTextBoxmtxt 信息显示控件Labellbl LinkLabelllbl StatusTripst ProgressBarpb 网页显示控件…

VMware中三种网络的区别

目录桥接模式仅主机模式NAT网络模式 桥接模式桥接模式 在Linux中,桥接模式通常指的是网络桥接(Network Bridging),它是一种将多个网络接口连接在一起的技术,形成一个局域网(LAN),使它们能够像在同一个网络中一样通信。仅主机模式仅主机网络 在仅主机模式下,虚拟网络是…

UE5之使用C++显示瞄准准星

1.创建控件蓝图 首先右键 用户界面---控件蓝图,创建一个控件蓝图CrosshairWidget,默认继承自UserWidget。在CrosshairWidget中新建一个Canvas Panel,再创建一个Image,加入准星图像并设置位置居中,这样准星的UI就完成了。 再添加一个图像,将其绘制为圆形盒体,这样就得到了…

20242802 2024-2025-2 《网络攻防实践》第二周作业

20242802 2024-2025-2 《网络攻防实践》第二周作业 目录 目录20242802 2024-2025-2 《网络攻防实践》第二周作业1. 实验要求2. 实验相关知识点nmap工具使用3. 实验详细过程3.1 从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:3.2尝试获取…