。。。。
这个其实也没什么定理不定理的。。
就是你把二项式定理拆成任意素数p进制的形式
然后你一化式子,对比一下系数就可以得到了
C ( n , m ) = 连 乘 C ( n i , m i ) 其 中 n i , m i 是 n , m 分 解 为 p 进 制 数 的 第 i 位 , 并 且 p 是 质 数 C(n,m) = 连乘C(ni,mi)其中ni,mi是n,m分解为p进制数的第i位,并且p是质数 C(n,m)=连乘C(ni,mi)其中ni,mi是n,m分解为p进制数的第i位,并且p是质数
然后就完事了我是不会告诉你明天我就要去学校了,一个月摸电脑的时间不多,只能打印一些毒瘤坑去学校补
#include<bits/stdc++.h>
#define MAXN 300005
typedef long long ll;
using namespace std;
ll n,m,p,jiecheng[MAXN] , t;
ll poww(ll x , ll y){
ll zz = 1;
while(y){
if(y & 1)zz = (zz * x) % p;
x = (x * x) % p;
y = y >> 1;
}
return zz % p;
}
ll C(ll a , ll b){
ll ans = 1;
for(int i = a - b + 1 ; i <= a ; i++)ans = (ans * i) % p;
for(int i = 1 ; i <= b ; i++)ans = (ans * poww(i , p - 2)) % p;
return ans;
}
void lcuss(){
ll ans = 1;
while(n && m){
ans = (ans * C(n % p , m % p)) % p;
m = m / p;
n = n / p;
}
cout<<ans % p<<endl;
return;
}
int main(){
cin>>t;
while(t--){
cin>>n>>m>>p;
n = n + m;
lcuss();
}
return 0;
}
当然啦,这类数论定理一般都有扩展定理
可惜我不会