NBUTOJ 1643 - 阶乘除法 - [数学题]
题目链接:https://ac.2333.moe/Problem/view.xhtml?id=1643
- 问题描述
输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1)。 比如,若 n=6, m=3,则 n!/m!=6!/3!=720/6=120。
是不是很简单?现在让我们把问题反过来:输入 k=n!/m!,找到这样的整数二元组(n,m) (n>m>=1)。
如果答案不唯一,n 应该尽量小。比如,若 k=120,输出应该是 n=5, m=1,而不是 n=6, m=3,因为 5!/1!=6!/3!=120,而 5<6。
- 输入
- 输入包含不超过 100 组数据。每组数据包含一个整数 k (1<=k<=10^9)。
- 输出
- 对于每组数据,输出两个正整数 n 和 m。无解输出"Impossible",多解时应让 n 尽量小。
- 样例输入
120
1
210- 样例输出
Case 1: 5 1
Case 2: Impossible
Case 3: 7 4
题解:
首先,impossible的情况只有1;并且所有k为奇数的情况,只能up = K, down = K - 1;
一开始,我想的是对于K,直接暴力枚举up = 1~K,筛掉k%up != 0的,然后剩下的只能while循环去除up - 1、up - 2、up - 3……这样,然后发现,TLE在O(K)枚举上;
然后改换思路,考虑到对于任意一个K,若 n × (n+1) × (n+2) × … × (n+len) = K,则显然len不可能大于p - 1,其中p满足p! > K 且 (p-1)! < K;
then,枚举len = p-1 ~ 1:对于每个len,down必须满足pow(down,len) < K,然后从1开始枚举down,算出 (down+1) × (down+2) × … × (down+len),判断一下即可。
最后考虑到之前O(K)枚举超时,所以特判当len=1时直接输出up = K, down = K - 1.
AC代码:
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll fact[];
void init()
{
fact[]=;
for(int i=;i<=;i++)
{
fact[i]=i*fact[i-];
//printf("fact[%d]=%I64d\n",i,fact[i]);
}
}
ll k;
int main()
{
init();
int kase=;
while(scanf("%I64d",&k)!=EOF)
{
if(k==)
{
printf("Case %d: Impossible\n",++kase);
continue;
}
if(k%==)
{
printf("Case %d: %I64d %I64d\n",++kase,k,k-);
continue;
} int maxlen;
bool ok=;
for(int i=;i<=;i++)
{
if(fact[i]==k)
{
printf("Case %d: %d %d\n",++kase,i,);
ok=;
break;
} if(fact[i]>k && fact[i-]<k)
{
maxlen=i-;
break;
}
}
if(ok) continue; ok=;
for(int len=maxlen;len>=;len--)
{
if(len==)
{
printf("Case %d: %I64d %I64d\n",++kase,k,k-);
break;
} for(ll down=;pow((double)down,(double)len)<(double)k;down++)
{
ll prod=; for(int i=;i<=len;i++) prod*=down+i; if(prod==k)
{
printf("Case %d: %I64d %I64d\n",++kase,down+len,down);
ok=;
break;
}
if(prod>k) break;
} if(ok) break;
}
}
}
NBUTOJ 1643 - 阶乘除法 - [数学题]的更多相关文章
- NOJ 1643 阶乘除法(YY+小技巧)
[1643] 阶乘除法 时间限制: 5000 ms 内存限制: 65535 K 问题描述 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1) ...
- CSUOJ 1781 阶乘除法
Description 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1). 比如,若 n=6, m=3,则 n!/m!=6!/3!=720 ...
- ZOJ 3688
做出这题,小有成就感 本来已打算要用那个禁位的排列公式,可是,问题在于,每个阶乘前的系数r的求法是一个难点. 随便翻了翻那本美国教材<组合数学>,在容斥原理一章的习题里竟有一道类似,虽然并 ...
- LeetCode竞赛题:笨阶乘(我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。)
通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.相反,我们设计了一个笨 ...
- 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )
sdut oj 简单n! Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个数n(0 <= n <= 150), ...
- 172. Factorial Trailing Zeroes(阶乘中0的个数 数学题)
Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...
- Random随机类(11选5彩票)BigInteger大数据类(华为面试题1000的阶乘)
先上Java Web图 为了简化叙述,只写Java代码,然后控制台输出 使用[Random类]取得随机数 import java.util.Random; public class Fir { pub ...
- UVA 11174 Stand in a Line (组合+除法的求模)
题意:村子里有n个人,给出父亲和儿子的关系,有多少种方式可以把他们排成一列,使得没人会排在他父亲的前面 思路:设f[i]表示以i为根的子树有f[i]种排法,节点i的各个子树的根节点,即它的儿子为c1, ...
- Algorithm --> 阶乘和因子
阶乘和因子 要求:输入正整数n(1<n <101), 把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2,3,5,...)的指数. 例如825=3x52x1 ...
随机推荐
- 大杂烩 -- Java中Iterator的fast-fail分析
基础大杂烩 -- 目录 Java中的Iterator非常方便地为所有的数据源提供了一个统一的数据读取(删除)的接口,但是新手通常在使用的时候容易报如下错误ConcurrentModificationE ...
- Docker应用之仓库
仓库是存放镜像的地方 注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库也可以有多个镜像 如 dl.dockerpool.com/ubuntu ,dl.dockerpool.com ...
- curl 上传文件
1)在 php 5.5.0 之前,如果使用 @+文件路径的文件上传文件,具体看这里:http://www.cnblogs.com/tujia/p/5938463.html 2)php 5.5.0 之后 ...
- Data Guard启动实时日志应用
1. REDO数据实时应用 启动实时应用的优势在于,REDO数据不需要等待归档完成,接收到即可被应用,这样执行角色切换时,操作能够执行得更快,因为日志是被即时应用的. 要启动实时应用也简单,前提是St ...
- iOS开发-iOS7禁用手势返回
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用 iOS7 返回手势 if ([self.nav ...
- sine曲线向前运动
using UnityEngine; using System.Collections; public class sineWork : MonoBehaviour { float verticalS ...
- iOS - 转场动画
苹果在 iOS7 定制了 ViewController 的切换效果 一 在iOS5和iOS6之前,ViewController的切换主要有4种 Push/Pop,NavigationViewCotnr ...
- Android学习之Spinner
Android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧.Spinner位于 android.widg ...
- 【软件分析与挖掘】An Empirical Study of Bugs in Build Process
摘要 对软件构建过程中所产生的错误(build process bugs)进行实证研究. 5个开源项目:CXF, Camel, Felix,Struts, and Tuscany. 把build pr ...
- 对 Sea.js 进行配置 seajs.config
配置 可以对 Sea.js 进行配置,让模块编写.开发调试更方便. seajs.config seajs.config(options) 用来进行配置的方法. seajs.config({ // 别名 ...