原文地址
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
const int maxn=1e5+10;
int cnt_pri;
int pri[maxn];
bool vis[maxn];
/*
知识点phi(n)=m的分解式
然后再去枚举所有因子的情况,找到最小的解n
注意:看到i*i<=m,我们只是筛选了 sqrt(m)以内的因子,后面的因子我们是没有判断的 //!!!效率问题
但不代表着,我们可以忽略; //!!!准确度的问题
*/
void get_prime(int M){
cnt_pri=0;
for(int i=2;i<=M;i++){
if(!vis[i]){
pri[cnt_pri++]=i;
for(int j=i*i;j<=M;j+=i)
vis[j]=true;
}
}
//printf("cnt_pri:%d\n",cnt_pri);
}
int cnt;
int p[maxn];
int used[maxn];
int judge(int x){
/*
int m=sqrt(x+0.5);
rep(i,2,m+1)if(x%i==0)return false;
*/
// printf("x:%d\n",x);
for(int i=0;i<cnt_pri&&pri[i]*pri[i]<=x;i++){
if(x%pri[i]==0)return false;
}
rep(i,0,cnt) if(used[i]&&p[i]==x)return false;
return true;
}
int ans;
void dfs(int res,int has,int pos){
//printf("res:%d has:%d pos:%d\n",res,has,pos);
if(pos==cnt){
if(has==1)ans=min(ans,res);
else if(judge(has+1)){//!!!
res*=(has+1);
ans=min(ans,res);
}
return;
}
dfs(res,has,pos+1);
if(has%(p[pos]-1))return;
used[pos]=true;
res*=p[pos],has/=(p[pos]-1);
dfs(res,has,pos+1);
while(has%p[pos]==0){
res*=p[pos];
has/=p[pos];
dfs(res,has,pos+1);
}
used[pos]=0;
}
int solve(int m){
cnt=0;
for(int i=0;i<cnt_pri&&(pri[cnt_pri]-1)*(pri[cnt_pri]-1)<=m;i++){//!!!
if(m%(pri[i]-1)==0){
p[cnt++]=pri[i];
}
}
//printf("cnt:%d\n",cnt);
//rep(i,0,cnt)printf("i:%d %d\n",i,p[i]);
memset(used,0,sizeof(used));
ans=200000000;
dfs(1,m,0);
return ans;
}
int main(){
//freopen("123.txt","w",stdout);
get_prime(1e4);
int m,kase=1;
while(scanf("%d",&m)==1&&m){
printf("Case %d: %d %d\n",kase++,m,solve(m));
}
return 0;
}