【HNOI】分数分解
题意描述
近来 IOI 专家们正在进行一项有关整数方程的研究,研究涉及到整数方程解集的统计问题,问题是这样的。
对任意的正整数 \(n\),我们有整数方程:
\[\frac{1}{x_1}+\frac{1}{x_2}+...+\frac{1}{x_n}=1
\]该整数方程的一个解集 \([x_1,x_2,...,x_n]\) 是使整数方程成立的一组正整数,例如 \([n,n,...,n]\)就是一个解集。
在统计解集时,IOI 专家把数据值相同但顺序不一样的解集认为是同一个解集。
例如:当 \(n=3\) 时,我们把 \([2,3,6]\) 和 \([3,6,2]\) 认为是同一个解集。
现在的任务是:对于一个给定的 \(m\),在最多只允许 \(1\) 个 \(x_i\) 大于 \(m\) 时,求出整数方程不同解集的个数。
其中数据保证 \(n\leq 20,m\leq 100\)。
就是弱化版的埃及分数
算法分析
直接搜索就是了,没什么太大的技巧。
两个上下界剪枝:(假设当前进行到第 \(depth\) 个)
- 如果后 \(n-depth+1\) 个分母都取最小值(上一个的分母)还 \(<1\),剪枝。
- 如果后 \(n-depth\) 个分母都取最大值(m),最后一个无穷小还 \(>1\) 剪枝。
注意精度问题和约分即可。
代码实现
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef double db;
const db eps=1e-15;
int n,m,ans=0;
int Gcd(int x,int y){
while(y^=x^=y^=x%=y);
return x;
}
void dfs(int dep,int last,int t1,int t2){
//dep 当前阶段,last 上一个分母,t1 当前的和的分子,t2 当前的和的分母。
int G=Gcd(t1,t2);
t1/=G,t2/=G;//约分不能少
if(dep==n){
if(t2-t1==1 && t2>=last) ++ans;//最后一个可以直接计算。
return;
}
db t=1-(db)t1/t2;
if(((db)(n-dep+1)/last)<t-eps) return;//剪枝 1。
if(((db)(n-dep)/m)>t+eps) return;// 剪枝 2。
for(int i=last;i<=m;i++)
dfs(dep+1,i,t1*i+t2,t2*i);
return;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=2;i<=m;i++) dfs(2,i,1,i);
printf("%d\n",ans);
return 0;
}
完结撒❀。
【HNOI】分数分解的更多相关文章
- 【SWUST626】分数分解
Position: * http://acm.swust.edu.cn/problem/0626/ * List SWUST626 分数分解 List Description Input Output ...
- 华为OJ平台——将真分数分解为埃及分数
题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...
- 埃及分解:将2/n分解成为1/x+1/y的格式
算法 古埃及以前创造出灿烂的人类文明,他们的分数表示却非常令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比方,2/1 ...
- 【Codevs1288】埃及分数
Position: http://codevs.cn/problem/1288/ Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/ ...
- JDOJ 1770 埃及分数
JDOJ 1770: 埃及分数 https://neooj.com/oldoj/problem.php?id=1770 Description 分子均为1的分数叫做埃及分数,因为古代埃及人在进行分数运 ...
- java实现第四届蓝桥杯埃及分数
埃及分数 古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比如,2/ ...
- [转]100个经典C语言程序(益智类问题)
目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事 ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
随机推荐
- <stdbool.h>的使用
转载: 1.https://www.cnblogs.com/jediael/archive/2013/02/03/4304259.html 2.https://zhidao.baidu.com/que ...
- The comparison between object and constructor
1.相似的地方 1.举个栗子:public struct Student{ string name; int age;}public class bike{ int weight; ...
- 远程触发Jenkins的Pipeline任务
场景 虽然能配置提交代码时触发Jenkins任务,但有时并不需要每次提交代码都触发,而是仅在有需要时才执行. 除了在Jenkins页面上手动执行任务,还可以向Jenkins网站发起HTTP请求,触发指 ...
- 极简 Node.js 入门 - 4.5 双工流
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- CSS的背景
CSS的背景 1. 背景颜色background-color div { background-color: 颜色值; } 一般情况下元素背景颜色默认是transparent(透明). 2. 背景图片 ...
- day27 Pyhton 面向对象02 类和对象的命名空间
一.内容回顾 类:具有相同属性和方法的一类事务 # 描述一类事务轮廓的一个机制 #商品/用户/店铺 对象/实例: 对象(实例)就是类的实例化 # 对象就是类的一个具体的表现 #某一件特定的商品/某个人 ...
- BUUCTF-数据包中的线索 1
打开题目里面一个pcapng的文件,于是我们拖进wireshark流量分析一波 发现有http的流量,于是我们过滤http 让后追踪http,然后发现base64的编码, 于是我们看到了base64编 ...
- 谈谈FTP
一.关于FTP 1.FTP是什么? FTP,全称"文件传输协议".属于TCP/IP四层模型中的应用层. 2.TCP/IP五层模型有哪些? 如图所示: 用文字叙述(从高层到底层): ...
- go 加锁
package mainimport ( "fmt" "math/rand" "sync" "time")var tic ...
- ansible用user/group模块管理受控机上的用户和组(ansible2.9.5)
一,ansible的user/group模块的用途: ansible的user模块用来实现:生成用户.删除用户等用户的管理ansible的group模块用来实现:生成组.删除组等组的管理 说明:刘宏缔 ...