#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long prime[400005],cnt;
long long n,sqr,tot,w[800005],g[800005],ind1[400005],ind2[400005],s,t,g_po[45];
bool vis[400005];
long long fpow(long long a,long long b){
long long ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
void init(){
vis[1]=1;
for(int i=2;i<=sqr;i++){
if(!vis[i])prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=sqr;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
long long l=1;
while(l<=n){
long long r=(n/(n/l));
tot++;
w[tot]=n/l;
g[tot]=(n/l-1);
if(n/l<=sqr)ind1[n/l]=tot;
else ind2[n/(n/l)]=tot;
l=r+1;
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=tot&&prime[i]*prime[i]<=w[j];j++){
int k=w[j]/prime[i]<=sqr? ind1[w[j]/prime[i]]:ind2[n/(w[j]/prime[i])];
g[j]=(g[j]-(g[k]-(i-1)));
}
}
}
long long ans=1;
int getid(long long x){
if(x<=sqr)return ind1[x];
return ind2[n/x];
}
int main(){
cin>>n>>s>>t;
if(s==0){
if(n==1)cout<<1<<endl;
else cout<<0<<endl;
return 0;
}
sqr=sqrt(n);
init();
g_po[1]=(fpow(1+s,t)+mod-2)%mod;
for(int i=2;i<=40;i++){
g_po[i]=(fpow(1+i*s,t)%mod-2*fpow(1+(i-1)*s,t)%mod+fpow(1+(i-2)*s,t)%mod+2*mod)%mod;
}
for(int i=1;i<=cnt&&n/prime[i]>n/sqr;i++){
long long pe=prime[i];
for(int e=1;pe<=n;pe*=prime[i],e++){
ans=ans*fpow(g_po[e],(n/pe-n/(pe*prime[i])))%mod;
}
}
long long po=0;
for(int i=1;i<=n/sqr;i++){
long long cnt=g[getid(n/i)]-g[getid(n/(i+1))];
po+=1ll*i*cnt;
}
ans=ans*fpow(g_po[1],po)%mod;
cout<<ans<<endl;
}