/*
   题意:n个开关,每个控制对应的灯,现要求m步使得最终状态的前v个灯亮
        每一步可同时按多个开关,也可以都不按,每一步都不能相同
        问有多少种方法(如果两种方法所有步的集合相同(即无序),则认为是同一种)

   看解题报告的
   可选的步骤集合是{0,1}^n  即2^n种
   求的是无序的,可以先求有序的
   设所求答案为fm(v),令gm(v) = m!fm(v)    (gm(v)是有步骤的)
   选择前面m-1个的方法有(m-1)!C(2^n,m-1)
   这样,确定前面m-1个了,则第m个即为vm = v⊕v1⊕v2⊕vm-1
   但这样有一个问题,因为题目要求两步不能相同,上面式子有可能vm = vi
   假设是vm=v1,则,v2⊕vm-1 = v 这就是规模为m-2的!!!
   所以gm(v) = (m-1)!C(2^n,m-1) - (m-1)(2^n-(m-2))gm-2(v)
                        选择跟某一个vi相同,而该vi可选的范围是(2^n-(m-2)),剩下的m-2个就是gm-2(v)
   则fm(v) = 1/m*C(2^n,m-1) - 1/m*(2^n-(m-2))*gm-2(v)
   注意的是初始条件!! f[0] = (v==0)

   还有一个地方,答案是取模一个素数的
   对于素数的话 逆元 (1/x) mod p = x^-1 mod p = x^(p-2) mod p
   因为素数 x^(p-1) %p= 1
*/

#include 
<iostream>
#include 
<cstdio>
#include 
<cstring>
#include 
<cmath>
#include 
<string>
#include 
<vector>
#include 
<algorithm>

using namespace std;

const int MAXN = 1010;
const int MOD = 10567201;

long long f[MAXN];
long long pow2[MAXN],inv[MAXN];

long long mpow(int a,int n)
{
    
if(n==1)return a%MOD;
    
long long ans = mpow(a,n/2);
    ans 
= ans*ans%MOD;
    
if(n&1)ans = ans*a%MOD;
    
return ans;
}

void init()
{
    pow2[
0= 1;
    
for(int i=1;i<=1000;i++)
    {
        pow2[i] 
= (pow2[i-1]<<1% MOD;
        inv[i] 
= mpow(i,MOD-2);
    }
}
long long comb(long long n,int m)
{
    
long long ans = 1;
    
for(int i=0;i<m;i++)
        ans 
= ans*(n-i)%MOD;
    
for(int i=1;i<=m;i++)
        ans 
= ans*inv[i]%MOD;
    
return ans;
}

int main()
{
    init();
    
int n,m,v;
    
while(scanf("%d%d%d",&n,&m,&v),n)
    {
        f[
0= (v==0);
        f[
1= 1;
        
//f[m] = 1/m(comb(2^n,m-1) - (2^n - (m-2))*f[m-2])
        for(int i=2;i<=m;i++)
        {
            f[i] 
= (comb(pow2[n],i-1- (pow2[n]-(i-2))*f[i-2]%MOD + MOD )%MOD;
            f[i] 
= f[i]*inv[i]%MOD;
        }
        printf(
"%lld\n",f[m]);
    }
    
return 0;
}