【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. ...
随机推荐
- 【题解】小Z的袜子
期末考试结束了,来写写blog吧 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具 ...
- 最新vue项目添加水印
在utils文件夹中创建 wartermark.ts 文件(位置看自己的组件放那,这都行),内容如下: 1 "use strict"; 2 3 const setWatermark ...
- vue使用vueCropper裁剪功能,代码复制直接使用
//先安装包 npm install vue-cropper --save-dev <template> <div id="merchantInformation" ...
- XML流操作
/// <summary> /// 保存XML为指定格式 /// </summary> /// <param name=& ...
- Makefile-4-书写命令
目录 前言 概念 Chapter 4:书写命令 4.1 显示命令 4.2 命令执行 * 4.3 命令出错 4.4 嵌套执行 make 4.5 定义命令包 参考 前言 本笔记主要记录Makefile一些 ...
- 在VC6.0下运行C语言程序,以及编程入门必备的常识类小知识!
今天给大家分享在VC6.0环境下编写C语言程序的基本步骤,为初学者打开学习C语言的第一道门.具体步骤如下(如果需要软件资源,可以留言): 1)新建工作区 依次点击 文件--新建--工作区 或是Ctrl ...
- redis 开启AOF 持久化
redis 开启AOF 找到redis 安装目录 打开 redis.conf 修改以下参数: appendonly yes (默认no,关闭)表示是否开启AOF持久化: append ...
- linux(centos8):安装jmeter5.3
一,jmeter的用途: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试, 它最初被设计用于Web应用测试,但后来扩展到其他测试领域. Apach ...
- 白话k8s-Pod的组成
k8s的所有功能都是围绕着Pod进行展开的,我们经常会看到类似这样一张图 告诉我们,Pod是一组container的集合,container之间可以通过localhost:port的方式直接访问. 感 ...
- 笔记之Utility.DataAccess
挤出时间看了一些代码,做一些笔记,备忘!!! 现在ORM随处可见,为什么不要已有的ORM而要手动写SQL呢?这肯定是有因为滴,存在必合理嘛! 自认为关于性能.维护.Maybe还有其他的,欢迎大家拍砖! ...