#include<bits/stdc++.h>
using namespace std;
#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--)
#define bug(x) printf("x:%d****\n",x)
typedef long long ll;
const int maxn=1010;
char str[maxn];
/*
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
.
*/
/*
平时最烦字符的题,发现只要找好了循环节,控制好边界,其实海星
*/
int cnt=0,len;
int get_xi(int& i){
int sig=1;
if(str[i]=='-')sig=-1,i++;
if(str[i]=='+')sig=1,i++;
if(str[i]=='n')return sig;
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans*sig;
}
int get_mi(int& i){
if(str[i]!='n'){
if(str[i]!=')')i++;
return 0;
}
i++;
if(str[i]!='^') {
if(str[i]!=')')i++;
return 1;
}
i++;
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans;
}
int get_d(int& i){
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans;
}
struct node{
int n,m;
}p[110];
ll pow_mod(ll base,int n,int mod){
ll ans=1;
while(n){
if(n&1)ans=ans*base%mod;
base=base*base%mod;
n>>=1;
}
return ans%mod;
}
ll solve(int x,int cnt,int d){
ll ans=0;
rep(i,0,cnt){
ll tmp=pow_mod(x,p[i].m,d);
ans=(ans+(ll)p[i].n*tmp%d)%d;
}
return ans;
}
int main(){
int kase=1;
while(scanf("%s",str)==1){
if(str[0]=='.')break;
int cnt=0;
len=strlen(str);
int pos=1;
while(pos<len){
p[cnt].n=get_xi(pos);
p[cnt].m=get_mi(pos);
cnt++;
if(str[pos]==')')break;
}
pos+=2;
int d=get_d(pos);
int k=p[0].m+1;
int wrong=0;
rep(i,0,k+1){
if(solve(i,cnt,d)){
wrong=1;break;
}
}
printf("Case %d: ",kase++);
if(!wrong) printf("Always an integer\n");
else printf("Not always an integer\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#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--)
#define bug(x) printf("x:%d****\n",x)
typedef long long ll;
const int maxn=1010;
char str[maxn];
/*
(n^2-n)/2
(2n^3+3n^2+n)/6
(-n^14-11n+1)/3
.
*/
/*
平时最烦字符的题,发现只要找好了循环节,控制好边界,其实海星
*/
int cnt=0,len;
int get_xi(int& i){
int sig=1;
if(str[i]=='-')sig=-1,i++;
if(str[i]=='+')sig=1,i++;
if(str[i]=='n')return sig;
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans*sig;
}
int get_mi(int& i){
if(str[i]!='n'){
if(str[i]!=')')i++;
return 0;
}
i++;
if(str[i]!='^') {
if(str[i]!=')')i++;
return 1;
}
i++;
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans;
}
int get_d(int& i){
int ans=0;
while(i<len&&str[i]>='0'&&str[i]<='9')ans=ans*10+str[i++]-'0';
return ans;
}
struct node{
int n,m;
}p[110];
ll pow_mod(ll base,int n,int mod){
ll ans=1;
while(n){
if(n&1)ans=ans*base%mod;
base=base*base%mod;
n>>=1;
}
return ans%mod;
}
ll solve(int x,int cnt,int d){
ll ans=0;
rep(i,0,cnt){
ll tmp=pow_mod(x,p[i].m,d);
ans=(ans+(ll)p[i].n*tmp%d)%d;
}
return ans;
}
/*
随机一下也是可以的
*/
int main(){
int kase=1;
while(scanf("%s",str)==1){
if(str[0]=='.')break;
int cnt=0;
len=strlen(str);
int pos=1;
while(pos<len){
p[cnt].n=get_xi(pos);
p[cnt].m=get_mi(pos);
cnt++;
if(str[pos]==')')break;
}
pos+=2;
int d=get_d(pos);
int k=p[0].m+1;
int wrong=0;
rep(i,0,1000){
int val=rand();
if(solve(val,cnt,d)){
wrong=1;break;
}
}
printf("Case %d: ",kase++);
if(!wrong) printf("Always an integer\n");
else printf("Not always an integer\n");
}
return 0;
}