标签:can const lse include turn for scanf bsp printf
Sol1:利用杨辉三角求C(N,M).坐标从 (0,0)开始,则第n行第m列就是C(N,M)
#include<bits/stdc++.h>
#define s 1100
using namespace std;
int x[s][s];
main()
{
int a,b,k,n,m;
x[0][0]=1;
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
a%=10007;
b%=10007;
for(int i=1;i<=k;i++)
for(int j=0;j<=i;j++)
x[i][j]=(x[i-1][j]+x[i-1][j-1])%10007;}
int product=x[k][n];
for(int i=1;i<=n;i++)product=product*a%10007;
for(int i=1;i<=m;i++)product=product*b%10007;
printf("%d",product);
return 0;
}
Sol2:
直接算组合数C(N,M)=分子/分母,然后在取模的时候,求出分母这一个数字针对P的逆元即可。
当然也可以在计算过程中,算出1到m每个数字针对P的逆元。转化成N*(N-1)*(N-2)*(N-M_1) * 1的逆元 * 2的逆元 * 3的逆元*.....M的逆元
求逆元的几种方法
1:单个数字可以用扩欧来求解
2:1--N之间所有数字,可以递推求解
3:用欧拉定理,直接找出逆元。
#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
long long ksm(long long a,long long b)
{
if(b==0)return 1;
if(b%2==0)return ksm(a,b>>1)*ksm(a,b>>1)%mod;
else return a*ksm(a,b>>1)*ksm(a,b>>1)%mod;
}
int main()
{
int a,b,k,m,n;
cin>>a>>b>>k>>n>>m;
int c=1,d=1;
for(int i=1;i<=n;i++)
c=c*i%mod;
for(int i=k-n+1;i<=k;i++)
d=d*i%mod;
d=d*ksm(c,mod-2)%mod;
d=d*ksm(a,n)*ksm(b,m)%mod;
cout<<d;
}
标签:can const lse include turn for scanf bsp printf
原文地址:https://www.cnblogs.com/cutemush/p/12005107.html