//f[i] a[i]和a[(i+1)%n]之积能被p整除的概率
//E=segmaE[i]=segma(f[i]*2000)
//如何求f[i]?
//因为p为素数 (a,p)=1,(b,p)=1 (ab,p)=1(反证法易证明)
//l[i]~r[i]中能被p整除的数的个数有: r/p-(l-1)/p (p组一个)
//F[i](从a[i]中取出不被整除的概率)=1-r/p-(l-1)/p/(r-l+1)
//所以可以间接求出 f[i]=1-F[i]F[j]
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1e5+20;
int l[N],r[N];
int p,a[N];
int n;
double f[N];
//f[i] a[i]和a[(i+1)%n]之积能被p整除的概率
//如何求f[i]?
//因为p为素数 (a,p)=1,(b,p)=1 (ab,p)=1(反证法易证明)
//l[i]~r[i]中能被p整除的数的个数有: r/p-(l-1)/p (p组一个)
//F[i](从a[i]中取出不被整除的概率)=1-r/p-(l-1)/p/(r-l+1)
//所以可以间接求出 f[i]=1-F[i]F[j])
//期望为(f[0]*2000+f[1]*2000...f[n]*2000)
int main()
{
cin>>n>>p;
for(int i=0;i<n;i++)
{
cin>>l[i]>>r[i];
a[i]=r[i]/p-(l[i]-1)/p;
//a[i]值为l[i]~r[i]之间的&&能被p整除的个数
}
double ans=0;
for(int i=0;i<n;i++)
{
double num1=1-(1.0*a[i])/(1.0*(r[i]-l[i]+1));//P=E/S
double num2=1-(1.0*a[(i+1)%n])/(1.0*(r[(i+1)%n]-l[(i+1)%n]+1));
ans+=(1-num1*num2)*2000;
//E=segma(E[i])
}
printf("%.10lf\n",ans);
return 0;
}