#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int N=20020000,nn=2e7;
const LL mo=20170408;
int n,m,p;
int prime[N],num;
LL x[102],y[102],ans[102],by[102];
bool b[N];
void pre()
{
for(int i=2;i<=nn;i++)
{
if(!b[i])
prime[++num]=i;
for(int j=1;j<=num&&i*prime[j]<=nn;j++)
{
b[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
b[1]=1;
}
void cheng(LL *a,LL *b)
{
mmst(by,0);
for(int i=0;ifor(int j=0;j
int x)
{
mmst(ans,0);
ans[0]=1;
for(;x;x>>=1,cheng(a,a))
if(x&1)
cheng(ans,a);
return ans[0];
}
int main()
{
pre();
cin>>n>>m>>p;
for(int i=1;i<=m;i++)
{
x[i%p]++;
if(b[i])
y[i%p]++;
}
cout<<(work(x,n)-work(y,n)+mo)%mo<return 0;
}