#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
struct node{//记录最长路径 和个数还有更好的方法
vector<int> child;
int parent;
};
node tree[maxn];
int depthnum[maxn];
int dnum=0;
int n;
double p,r;
void pre(int index,int depth)
{
if(tree[index].child.empty())
{
depthnum[dnum++]=depth;
return;
}
for(int i=0;i<tree[index].child.size();i++)
pre(tree[index].child[i],depth+1);
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
cin>>n>>p>>r;
r=r/100;
for(int i=0;i<n;i++)
{
int num;
cin>>num;
tree[i].parent=num;
if(num!=-1) tree[num].child.push_back(i);
}
int root;
for(int i=0;i<n;i++)
if(tree[i].parent==-1) {
root=i;
break;
}
pre(root,0);
sort(depthnum,depthnum+n,cmp);
int qw=1;
for(int i=1;i<n;i++)
{
// cout<<depthnum[i]<<endl;
if(depthnum[i]==depthnum[0]) qw++;
}
printf("%.2lf",p*pow(1+r,depthnum[0]));
cout<<" "<<qw;
return 0;
}
vector<int> child;
int parent;
};
node tree[maxn];
int depthnum[maxn];
int dnum=0;
int n;
double p,r;
void pre(int index,int depth)
{
if(tree[index].child.empty())
{
depthnum[dnum++]=depth;
return;
}
for(int i=0;i<tree[index].child.size();i++)
pre(tree[index].child[i],depth+1);
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
cin>>n>>p>>r;
r=r/100;
for(int i=0;i<n;i++)
{
int num;
cin>>num;
tree[i].parent=num;
if(num!=-1) tree[num].child.push_back(i);
}
int root;
for(int i=0;i<n;i++)
if(tree[i].parent==-1) {
root=i;
break;
}
pre(root,0);
sort(depthnum,depthnum+n,cmp);
int qw=1;
for(int i=1;i<n;i++)
{
// cout<<depthnum[i]<<endl;
if(depthnum[i]==depthnum[0]) qw++;
}
printf("%.2lf",p*pow(1+r,depthnum[0]));
cout<<" "<<qw;
return 0;
}