题目链接: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 - 阶乘除法 - [数学题]的更多相关文章

  1. NOJ 1643 阶乘除法(YY+小技巧)

    [1643] 阶乘除法 时间限制: 5000 ms 内存限制: 65535 K 问题描述 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1) ...

  2. CSUOJ 1781 阶乘除法

    Description 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1). 比如,若 n=6, m=3,则 n!/m!=6!/3!=720 ...

  3. ZOJ 3688

    做出这题,小有成就感 本来已打算要用那个禁位的排列公式,可是,问题在于,每个阶乘前的系数r的求法是一个难点. 随便翻了翻那本美国教材<组合数学>,在容斥原理一章的习题里竟有一道类似,虽然并 ...

  4. LeetCode竞赛题:笨阶乘(我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。)

    通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.相反,我们设计了一个笨 ...

  5. 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )

    sdut oj 简单n! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个数n(0 <= n <= 150), ...

  6. 172. Factorial Trailing Zeroes(阶乘中0的个数 数学题)

    Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...

  7. Random随机类(11选5彩票)BigInteger大数据类(华为面试题1000的阶乘)

    先上Java Web图 为了简化叙述,只写Java代码,然后控制台输出 使用[Random类]取得随机数 import java.util.Random; public class Fir { pub ...

  8. UVA 11174 Stand in a Line (组合+除法的求模)

    题意:村子里有n个人,给出父亲和儿子的关系,有多少种方式可以把他们排成一列,使得没人会排在他父亲的前面 思路:设f[i]表示以i为根的子树有f[i]种排法,节点i的各个子树的根节点,即它的儿子为c1, ...

  9. Algorithm --> 阶乘和因子

    阶乘和因子 要求:输入正整数n(1<n <101), 把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2,3,5,...)的指数. 例如825=3x52x1 ...

随机推荐

  1. SQLServer------远程调用失败

    1.情况 出现 2.解决方法 打开“控制面板” -> “卸载程序” -> 找到 “Microsoft SQL Server 2016) ExpressLocalDB”将其卸载 -> ...

  2. Java压缩包解压到指定文件

    在获得一个以Zip格式压缩的文件之后,需要将其进行解压缩,还原成压缩前的文件.若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Wi ...

  3. Python中的类(中)

    上一篇介绍了Python中类相关的一些基本点,本文看看Python中类的继承和__slots__属性. 继承 在Python中,同时支持单继承与多继承,一般语法如下: class SubClassNa ...

  4. ios开发之--解决“Could not insert new outlet connection”的问题。

    在Xcode中,我们能够在StoryBoard编辑界面或者是xib编辑界面中通过“Control键+拖拽“的方式将某个界面元素和相应的代码文件连接起来.在代码文件里创建outlet. 只是.假设你的运 ...

  5. Synchronizing Threads and GUI in Delphi application

    Synchronizing Threads and GUI   See More About delphi multithreading tthread class user interface de ...

  6. 判断资源贴图是否有alpha

    /* modfly selected textures`s maxSize and ImportFormat bool hasAlpha = true; if(hasAlpha)then(textur ...

  7. linux CentOS 7 安装 RabbitMQ 3.6.3, Erlang 19.0

    1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixO ...

  8. PHP curl get post通用类

    <?php /** * @author:xiaojiang * curl 通用方法 ..get /post 传送数据 */ class process{ const GET = 0; const ...

  9. 【Mybatis】Mybatis基本构成

    SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口) SqlSessionFactory:依靠工厂来生成SqlSes ...

  10. 【大数据系列】使用api修改hadoop的副本数和块大小

    package com.slp.hdfs; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.h ...