题意描述

近来 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\) 个)

  1. 如果后 \(n-depth+1\) 个分母都取最小值(上一个的分母)还 \(<1\),剪枝。
  2. 如果后 \(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】分数分解的更多相关文章

  1. 【SWUST626】分数分解

    Position: * http://acm.swust.edu.cn/problem/0626/ * List SWUST626 分数分解 List Description Input Output ...

  2. 华为OJ平台——将真分数分解为埃及分数

    题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...

  3. 埃及分解:将2/n分解成为1/x+1/y的格式

    算法 古埃及以前创造出灿烂的人类文明,他们的分数表示却非常令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比方,2/1 ...

  4. 【Codevs1288】埃及分数

    Position: http://codevs.cn/problem/1288/ Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/ ...

  5. JDOJ 1770 埃及分数

    JDOJ 1770: 埃及分数 https://neooj.com/oldoj/problem.php?id=1770 Description 分子均为1的分数叫做埃及分数,因为古代埃及人在进行分数运 ...

  6. java实现第四届蓝桥杯埃及分数

    埃及分数 古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比如,2/ ...

  7. [转]100个经典C语言程序(益智类问题)

    目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事 ...

  8. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  9. 【算法】C语言趣味程序设计编程百例精解

    C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1)  https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...

随机推荐

  1. JS寄快递地址智能解析

    JS寄快递地址智能解析--2020年7月15日 去年做了些前端内容,最近在整理一些稍微有点用的内容,比如智能解析地址,用户只要输入:张三1351111111江苏省扬州市广陵区XX小区X楼xxx室,就能 ...

  2. matplotlib绘图教程,设置标签与图例

    大家好,欢迎大家阅读周四数据处理专题,我们继续介绍matplotlib作图工具. 在上一篇文章当中我们介绍了matplotlib这个包当中颜色.标记和线条这三种画图的设置,今天我们同样也介绍三种新的设 ...

  3. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  4. MATLAB鼠标事件

    来源:https://blog.csdn.net/weixin_39090239/article/details/80586930 前记: 人机交互的方式--键盘开关.鼠标.触摸屏.体感传感器(Kin ...

  5. CSG:清华大学提出通过分化类特定卷积核来训练可解释的卷积网络 | ECCV 2020 Oral

    论文提出类特定控制门CSG来引导网络学习类特定的卷积核,并且加入正则化方法来稀疏化CSG矩阵,进一步保证类特定.从实验结果来看,CSG的稀疏性能够引导卷积核与类别的强关联,在卷积核层面产生高度类相关的 ...

  6. [学习笔记] 数位DP的dfs写法

    跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...

  7. 通用redis

    import lombok.extern.slf4j.Slf4j;import org.apache.poi.ss.formula.functions.T;import org.rcisoft.cor ...

  8. spring-boot-route(十四)整合Kafka

    在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...

  9. CMD/ENTROYPOINT区别

    CMD/ENTROYPOINT区别 相同点:都是指定一个容器:启动时要运行的命令 不同点(重点): CMD: dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker ...

  10. element Ui的级联选择器 任意一级选中下拉框自动关闭

    封装成一个子组件 <template> <el-cascader v-model="value" clearable placeholder="请选择& ...