#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int k[N],p[N];
int cnt1=0,cnt2=0;//两部分的计算数量
int a[N],b[N];//分别计算两边
int n,m;
int mid,ans;//中间值和答案
inline int Pow(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res*=a;
a*=a;
b>>=1;
}
return res;
}
inline void dfsl(int fine,int all)//当前填好了几位,总和为几
{
if(fine == mid )//都填好了(已经dfs到叶子节点了)
{
a[++cnt1]=all;
return ;//(回溯)
}
for(int i=1;i<=m;i++)//现在尝试去填写fine+1位
{
dfsl(fine+1,all+Pow(i,p[fine+1]) * k[fine+1]);
}
}
inline void dfsr(int fine,int all)//当前填好了几位,总和为几
{
if(fine == n )//都填好了(已经dfs到叶子节点了)
{
b[++cnt2]=all;
return ;//(回溯)
}
for(int i=1;i<=m;i++)//现在尝试去填写fine+1位
{
dfsl(fine+1,all+Pow(i,p[fine+1]) * k[fine+1]);
}
}
int main()
{
cin >> n >> m;//n个未知数,每个未知数的范围
for(int i=1;i<=n;i++)
{
cin >> k[i] >> p[i] ;
}
mid=n/2;
dfsl(0,0);
dfsr(mid,0);
sort(b+1,b+cnt2+1);
for (int i = 1 ; i <= cnt1 ; i++)
{
ans += (upper_bound(b + 1 , b + 1 + cnt2 , -a[i]) - b) - (lower_bound(b + 1 , b + 1 + cnt2 , -a[i]) - b);
}
cout << ans;
return 0;
}