题目链接: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. MS Chart Control 學習手記(二) - 圓餅圖

    using System.Web.UI.DataVisualization.Charting; 02 using System.Drawing; 03   04 namespace Chart.AJA ...

  2. 新版本的body-parser中间件和morgan中间件引用问题:body-parser deprecated bodyParser和morgan deprecated morgan(options)

    引用新版本的body-parser中间件和morgan中间件时,报如下问题: Fri, 09 Jan 2015 06:32:04 GMT morgan deprecated morgan(option ...

  3. pgpool-II 的使用

    1.pgpool-II的概念 pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能: 连接池 pgpool-II 保持已经连接 ...

  4. 使用 urllib 处理 HTTP 异常

    (1) 我们发起 HTTP 请求,有时会发生异常,如请求超时,登录密码错误,请求链接不存在等等,使用 urllib.request.URLError 可以捕获这些与 URL 相关的异常(2) urll ...

  5. 【译】调优Apache Kafka集群

    今天带来一篇译文“调优Apache Kafka集群”,里面有一些观点并无太多新颖之处,但总结得还算详细.该文从四个不同的目标出发给出了各自不同的参数配置,值得大家一读~ 原文地址请参考:https:/ ...

  6. java虚拟机性能监控调优及原则

    摘抄 http://uule.iteye.com/blog/2114697 一.JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  7. mysql基础知识笔记

    Mysql基础笔记 环境配置 基本概念 mysql命令行 进入 use show 查询 select order by where like 数据过滤regexp concat 文本函数 日期函数 数 ...

  8. 123、 android Retrofit 介绍和使用(转载)

    简单使用:http://blog.csdn.net/bitian123/article/details/51899716 http://blog.csdn.net/duanyy1990/article ...

  9. tp3.2中怎么访问分类及子分类下面的文章

    在项目开发过程中,我们可能会遇到在进入文章分类时需要遍历文章分类及文章子分类下面的文章的情况,具体解决步骤如下: 一.为便于理解,这里列出用到的表及字段 文章分类表(article_cate) 文章表 ...

  10. 清空Cookie

    function delCookie() { ; i < cookies.length; i++) { try { document.cookie = cookies[i] + "=0 ...