题目链接:点击打开链接
题目思路很清晰,就不讲解了,思路分析直接详细写在代码了,代码如下:
#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
int main()
{
ll k;
ll tmp; //记录遍历上限
int p=1;
while(cin>>k)
{
cout<<"Case "<<p++<<": ";
ll n=k,m=k-1,sum=1; //所有的奇数的都是n和n-1的阶乘
ll left=1,right=2; //记录乘积区间左右端点
tmp=(ll)sqrt(k)+20;
bool flag=true;
while(left<tmp) //确定乘积区间
{
while(right<tmp&&sum<k) //首先确定一段区间,再进行推移
{
sum*=right;
right++;
}
if(sum==k)
{
n=right-1; //因为在上面的循环里多加了一次1
m=left;
flag=false;
break; //只要找到了就停止循环
}
sum/=left;
left++;
}
if(!flag)
{
if(m!=1)
m--;
}
if(k==1)
cout<<"Impossible"<<endl;
else
cout<<n<<' '<<m<<endl;
}
return 0;
}