#include <bits/stdc++.h>
using namespace std;
int const N=3010;
int son[N][N];
int n,k;
long long seed,val[N],s[N],res;
long long Max(int x){
s[x]=0;
long long m;
if (!son[x][0]) return val[x];
for (int i=1;i<=son[x][0];i++){
m=Max(son[x][i]);
if (s[x]<m) s[x]=m;
}
return s[x];
}
void dfs(int x){
int u;
long long w=-1;
for (int i=1;i<=son[x][0];i++){
if (w<s[son[x][i]]) w=s[son[x][i]],u=son[x][i];
}
if (x==1) res+=w;
val[x]=0,s[x]=0;
if (son[x][0]) dfs(u);
return;
}
int main(){
freopen("x.in","r",stdin);
freopen("x.out","w",stdout);
scanf("%d %d %lld",&n,&k,&seed);
if (n>3000){
printf("1");
return 0;
}
long long v;
int f;
val[1]=seed;
for (int i=2;i<=n;i++){
v=(val[i-1]*23333333+6666666)%1000000007;
f=(v xor 23333333)%(i-1)+1;
son[f][++son[f][0]]=i,val[i]=v;
}
for (int i=1;i<=k;i++){
Max(1);dfs(1);
}
printf("%lld",res+val[1]);
return 0;
}