zoukankan      html  css  js  c++  java
  • NOJ 1643 阶乘除法(YY+小技巧)

    • [1643] 阶乘除法

    • 时间限制: 5000 ms 内存限制: 65535 K
    • 问题描述
    • 输入两个正整数 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

    试了打表、除法、都不行,我还是太若比了,还是看了别人的代码才知道怎么写,最关键就是控制外循环的范围。

    代码:

    #include<stdio.h>
    int main(void)
    {
    	__int64 i,j,sum,n;
    	int t=0;
    	bool ok;
    	while(~scanf("%I64d",&n))
    	{
    		t++;
    		ok=0;
    		for(i=1;i*i<=n;i++)//就是这个地方需要i*i<=n
    		{
    			sum=i;
    			for(j=i+1;;j++)
    			{
    				sum=sum*j;
    				if(sum==n)
    				{
    					if(i!=1)
    						i--;//若分母不为1,则减1
    					printf("Case %d: %I64d %I64d
    ",t,j,i);
    					ok=1;
    					break;
    				}
    				if(sum>n)
    					break;
    			}
    			if(ok)
    				break;
    		}
    		if(!ok)
    		{
    			if(n!=1)
    				printf("Case %d: %I64d %I64d
    ",t,n,n-1);
    			else
    			printf("Case %d: Impossible
    ",t);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/Blackops/p/5255225.html
Copyright © 2011-2022 走看看