#include<bits/stdc++.h>
using namespace std;
//mod值必须是素数
//做法不唯一,可以
//(1)通过循环,预先算好所有小于max_number的阶乘(%p)的结果,存到fac[max_number]里 (fac[i] = i!%p)
//然后用求逆的方法求出结果
long long mod=31;
long long pow_mod(int x,int y,int c){
if(y==0) return 1;
long long q=pow_mod(x,y/2,c)%c;
if(y&1) return (q*q*x)%c;
else return (q*q)%c;
}
//把阶乘取模后的结果存起来,算到m因为m大,这样不用重复计算
int fac[100001];
long long C1(int m,int n){
fac[0]=1;
int i=0;
while(i<=m){
// cout<<fac[i];
fac[i+1]=fac[i]*(i+1)%mod;
i++;
}
//因为 n!%p的逆 = n!的逆%p,因为是模几逆
return fac[m]*pow_mod(fac[n],mod-2,mod)%mod*pow_mod(fac[m-n],mod-2,mod)%mod;
}
//使用组合数递推式,入门经典讲的,快
long long C2(int m,int n){
if(n==0) return 1;
return C2(m,n-1)*(m-n+1)%mod*pow_mod(n,mod-2,mod)%mod;
}
int main()
{
cout<<C1(4,2)<<endl;
cout<<C2(4,2)<<endl;
return 0;
}