【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. ...
随机推荐
- JS寄快递地址智能解析
JS寄快递地址智能解析--2020年7月15日 去年做了些前端内容,最近在整理一些稍微有点用的内容,比如智能解析地址,用户只要输入:张三1351111111江苏省扬州市广陵区XX小区X楼xxx室,就能 ...
- matplotlib绘图教程,设置标签与图例
大家好,欢迎大家阅读周四数据处理专题,我们继续介绍matplotlib作图工具. 在上一篇文章当中我们介绍了matplotlib这个包当中颜色.标记和线条这三种画图的设置,今天我们同样也介绍三种新的设 ...
- 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...
- MATLAB鼠标事件
来源:https://blog.csdn.net/weixin_39090239/article/details/80586930 前记: 人机交互的方式--键盘开关.鼠标.触摸屏.体感传感器(Kin ...
- CSG:清华大学提出通过分化类特定卷积核来训练可解释的卷积网络 | ECCV 2020 Oral
论文提出类特定控制门CSG来引导网络学习类特定的卷积核,并且加入正则化方法来稀疏化CSG矩阵,进一步保证类特定.从实验结果来看,CSG的稀疏性能够引导卷积核与类别的强关联,在卷积核层面产生高度类相关的 ...
- [学习笔记] 数位DP的dfs写法
跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...
- 通用redis
import lombok.extern.slf4j.Slf4j;import org.apache.poi.ss.formula.functions.T;import org.rcisoft.cor ...
- spring-boot-route(十四)整合Kafka
在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...
- CMD/ENTROYPOINT区别
CMD/ENTROYPOINT区别 相同点:都是指定一个容器:启动时要运行的命令 不同点(重点): CMD: dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker ...
- element Ui的级联选择器 任意一级选中下拉框自动关闭
封装成一个子组件 <template> <el-cascader v-model="value" clearable placeholder="请选择& ...