#include<bits/stdc++.h>
using namespace std;
#define N 100000
bool status[N+1];
vector<int>primes;
//can store upto 664578 primes
void seive(){
    int i,j,total=1,len;
    primes.push_back(2);
    len=sqrt(N);
    for(i=3;i<=len;i+=2){
        if(!status[i]){
            for(j=i*i;j<=N;j+=i)status[j]=true;
        }
    }
    for(i=3;i<=N;i+=2){
        if(!status[i]){
            primes.push_back(i);
            total++;
        }
    }
    //return total;
}
vector<int>numPF(int n){
    vector<int>facts;
    int pf_idx=0,pf=primes[pf_idx],ans=0;
    while(pf*pf<=n){
        if(n%pf==0){
            facts.push_back(pf);
            while(n%pf==0)n/=pf;
        }
        pf=primes[++pf_idx];
    }
    if(n!=1)facts.push_back(n);
    return facts;
}
pair<int,int>sqrechk(int x){
    int a,b;
    a=0,b=x;
    while(a<=b){
        if(a*a+b*b==x)return make_pair(a,b);
        else if(a*a+b*b>x)b--;
        else a++;
    }
    return make_pair(-1,-1);
}
typedef pair<int,int> ii;
int main(){
    seive();
    int n,i,sz,cases=0;
    while(scanf("%d",&n)!=EOF){
        vector<int>facts;
        facts=numPF(n);
        sz=facts.size();
        vector<ii>ans;
        printf("Case #%d: ",++cases);
        //for(i=0;i<facts.size();i++)cout<<facts[i]<<" ";
        if(sz==0)printf("\n");
        else{
            for(i=0;i<sz;i++){
                if(facts[i]%4==3)ans.push_back(ii(facts[i],0));
                else ans.push_back(sqrechk(facts[i]));
            }
            sz=ans.size();
            for(i=0;i<sz-1;i++){
                if(ans[i].second==0)printf("%d, ",ans[i].first);
                else if(ans[i].second==1)printf("%d+j, %d-j, ",ans[i].first,ans[i].first);
                else printf("%d+%dj, %d-%dj, ",ans[i].first,ans[i].second,ans[i].first,ans[i].second);
            }
            if(ans[sz-1].second==0)printf("%d\n",ans[sz-1].first);
            else if(ans[sz-1].second==1)printf("%d+j, %d-j\n",ans[sz-1].first,ans[sz-1].first);
            else printf("%d+%dj, %d-%dj\n",ans[sz-1].first,ans[sz-1].second,ans[sz-1].first,ans[sz-1].second);
        }
    }
    return 0;
}

