虽然冬天很远,松鼠不得不日夜工作以节省豆类。 他们需要大量的食物来度过这漫长的寒冷日子。 一段时间后,松鼠家庭认为他们必须解决问题。 他们认为他们会在不同的树木中储存豆子。 然而,由于现在的食物不足,他们只能吃到豆子。 他们想知道有多少种方法可以在n树中保存不超过m个bean(它们是相同的)。

现在他们求助于你,你应该给他们答案。 结果可能非常巨大; 你应该输出模p的结果,因为松鼠无法识别大数。

Input

第一行包含一个整数T,表示案例数。

然后是T行,每行包含三个整数n,m,p,意味着松鼠将在n个不同的树中保存不超过m个相同的bean,1 <= n,m <= 1000000000,1

 

Output

你应该输出模p的答案。

Sample Input

2
1 2 5
2 1 5

Sample Output

3
3

        
  

Hint

提示:

对于样本1,松鼠将在一棵树中放置不超过2个豆。 由于树木不同,我们可以将它们标记为1,2 ......等等。

3种方法是:不放豆,将1个豆放在树1中,将2个豆放在树1中。对于样品2,3种方法是:   没有豆,把1豆放在树1中,把1豆放在树2中。

题解:题目是让求C(n+m,n),直接作为模板使用就可以了

#include <bits/stdc++.h>
using namespace std;
long long p,m1,n1;
long long Pow(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            b--;
            ans=(ans*a)%p;
        }
        b>>=1;
        a=(a*a)%p;
    }
    return ans;
}
long long C(long long n,long long m)
{
    if(n<m)
        return 0;
    long long a=1,b=1;
    while(m)
    {
        a=(a*n)%p;
        b=(b*m)%p;
        m--;
        n--;
    }
    return (a*Pow(b,p-2))%p;
}
long long Lucas(long long n,long long m)
{
    if(m==0)
        return 1;
    return Lucas(n/p,m/p)*C(n%p,m%p)%p;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld",&n1,&m1,&p);
        printf("%lld\n",Lucas(n1+m1,n1));  
    }
    return 0;
}