3359 AC.now coder.com/discuss/187813? 类型=101 order=0pos=1page=0
3359 blog.csdn.net/shadandeajian/article/details/82084087
1 .适用于单纯形法----n,m小
#包含用户名称空间TD; 常数上限=1000; int C[MAXN 1][MAXN 1]; //排列组合数c(m,n )上为m,下为nm )/c ) m,n )=n! /m! /(n-m (!=n标致的鸽子(n-1 )标致的鸽子(标致的鸽子) n-m 1)/m! 水平。
intBaoli_c(intm,int n ) /暴力法这里n=15
{int summ=1,sumn=1; //其实C(M,n )计算min ) m,n-m次即可
if(Mn-m )是
m=n-m; for(intI=1; i=m; I ) {
summ标致的鸽子=i;
sumn=sumn标致的鸽子(n-i 1);
}返回三星/三星;
) }void dabiao_C ()//表化,数据为int,溢出数据n60//C(n ) n、m )=c(n-1,m - 1 ) cmdbd (n-1,m ) )
for(intI=0; I )
{//C[i][0]=1; C[0][i]=0; //这个写法的顺序是错误的。 因为这样写C[0][0]=0。
C[0][i]=0; C[i][0]=1;
}for(intI=1; I )
for(intj=1; j )
c [ I ] [ j ]=c [ I-1 ] [ j-1 ] sq DPD [ I-1 ] [ j ];
}intmain () ) ) ) )。
dabiao_C (; intm,n; wile(cinMn ) { //mcout
}
}
2 .求2.Lucas定理组合数
组合数c(n,m ) % p
=(n! /m! /(n-m (! %mod组合数平静下来的纸飞机
=n! 标致的鸽子inv(m! 标致的鸽子(n-m )! %mod转换psdmj
=n! 标致的鸽子(m! 标致的鸽子((n-m )! (^ ) ^(mod-2 ) ) %mod因为p是素数,所以从有费马小定理可以看出,m! 标致的鸽子(n - m )! 关于p的逆元是m! 标致的鸽子(n - m )! 的p-2次方。
=(N标致的鸽子(n-1 )标致的鸽子) .标致的鸽子(n-m 1)/m! () mod.=) ) n标致的鸽子(n-1标致的鸽子),标致的鸽子(n-m 1) )标致的鸽子(m^(mod-2 ) ),mod。
第一种情况是,在p为素数且p小的情况下,用列表记录阶乘%mod的值--- n! 标致的鸽子(m! 标致的鸽子((n-m )! ^(mod-2 ) %mod
#包含用户名称空间TD; #定义长龙
常数上限=1000; #define mod 998244353
常数int maxn=1e510;
ll fac[maxn]; //maxn必须小于1e5,以使Lucas定理为wwddt
对void Init ()//阶乘进行表格
}
}
LLquickpow(LLa,ll b ) {
ll t=a,ans=1; while(b!=0) if(B1==1) ) ) )。
t=t标致的鸽子t%mod;
b=1;
}返回ans % mod;
}
LLC(LLn,ll m ) if (Mn ) return 0; 返回fac[n-m]标致的鸽子quickpow(fac[m]标致的鸽子fac[n-m],mod-2 ) %mod;
}
LLLucas(LLn,ll m ) if ) m==0) return 1; 返回Lucas (n/mod,m/mod )标致的鸽子c ) n%mod,m%mod ) %mod;
}intmain () ) ) ) )。
ll n,m;
Init (; wile(cinnm ) {
出局了
}
}
第二种情况,p是质数,且p比较大,很难戴表---(n标致的鸽子(n ) ) )。
1)标致的小鸽子..标致的小鸽子(n-m+1) / m!) %mod.#includeusing namespacestd;#define ll long long
const int MAXN = 1000;#define mod 998244353ll pow(ll a, ll b, ll m)
{
ll ans= 1;
a%=m;while(b)
{if(b & 1)ans = (ans % m) 标致的小鸽子 (a % m) %m;
b/= 2;
a= (a % m) 标致的小鸽子 (a % m) %m;
}
}
ll inv(ll x, ll p)//x关于p的逆元,p为素数
{return pow(x, p - 2, p);
}
ll C(ll n, ll m, ll p)//组合数C(n, m) % p = (n!/m!/(n-m)!)%mod = n!标致的小鸽子inv(m!标致的小鸽子(n-m)!)%mod = n!标致的小鸽子(m!标致的小鸽子((n-m)!)^(mod-2))%mod
{if(m > n)return 0;
ll up= 1, down = 1;//分子分母;
for(int i = n - m + 1; i <= n; i++)up = up 标致的小鸽子 i %p;for(int i = 1; i <= m; i++)down = down 标致的小鸽子 i %p;return up 标致的小鸽子 inv(down, p) %p;
}
ll Lucas(ll n, ll m, ll p)
{if(m == 0)return 1;return C(n % p, m % p, p) 标致的小鸽子 Lucas(n / p, m / p, p) %p;
}intmain(){intm,n;while(cin>>m>>n){ //mcout
}
}
#includeusing namespacestd;
typedeflong longll;const int maxn = 1e6 + 10;const int mod = 1e9 + 7;
ll pow(ll a, ll b, ll m)
{
ll ans= 1;
a%=m;while(b)
{if(b & 1)ans = (ans % m) 标致的小鸽子 (a % m) %m;
b/= 2;
a= (a % m) 标致的小鸽子 (a % m) %m;
}
}
ll extgcd(ll a, ll b, ll& x, ll&y)//求解ax+by=gcd(a, b)//返回值为gcd(a, b)
{
ll d=a;if(b)
{
d= extgcd(b, a %b, y, x);
y-= (a / b) 标致的小鸽子x;
}else x = 1, y = 0;returnd;
}
ll mod_inverse(ll a, ll m)//求解a关于模上m的逆元//返回-1表示逆元不存在
{
ll x, y;
ll d=extgcd(a, m, x, y);return d == 1 ? (m + x % m) % m : -1;
}
ll Mul(ll n, ll pi, ll pk)//计算n! mod pk的部分值 pk为pi的ki次方//算出的答案不包括pi的幂的那一部分
{if(!n)return 1;
ll ans= 1;if(n /pk)
{for(ll i = 2; i <= pk; i++) //求出循环节乘积
if(i % pi)ans = ans 标致的小鸽子 i %pk;
}for(ll i = 2; i <= n % pk; i++)if(i % pi)ans = ans 标致的小鸽子 i %pk;return ans 标致的小鸽子 Mul(n / pi, pi, pk) % pk;//递归求解
}
ll C(ll n, ll m, ll p, ll pi, ll pk)//计算组合数C(n, m) mod pk的值 pk为pi的ki次方
{if(m > n)return 0;
ll a= Mul(n, pi, pk), b = Mul(m, pi, pk), c = Mul(n -m, pi, pk);
ll k= 0, ans;//k为pi的幂nqdqj/p>
for(ll i = n; i; i /= pi)k += i /pi;for(ll i = m; i; i /= pi)k -= i /pi;for(ll i = n - m; i; i /= pi)k -= i /pi;
returnans;
}
ll Lucas(ll n, ll m, ll p)
{
ll x=p;
ll ans= 0;for(ll i = 2; i <= p; i++)
{if(x % i == 0)
{
ll pk= 1;while(x % i == 0)pk 标致的小鸽子= i, x /=i;
}
}returnans;
}intmain()
{
ll n, m, p;while(cin >> n >> m >>p)
{
cout
}
return 0;
}
#includeusing namespace std;
#define mod 998244353
#define ll long long
ll fac[100005];
void Init(){
for(int i=1;i<=100000;i++)
}
long long quickmod(int x,int y)
{
if(x==0)
return 0;
long long t=x,ans=1;
while(y!=0)
{
if(y&1==1)
t=(t标致的小鸽子t)%mod;
y>>=1;
}
return ans;
}
ll C(int n,int m){
return fac[n]/fac[n-m]标致的小鸽子quickmod(fac[m],mod-2)%mod;
}
ll Lucas(int n,int m){
if(m==0)
return 1;
return Lucas(n/mod,m/mod)标致的小鸽子C(n%mod,m%mod)%mod;
}
int main()
{
Init();
int T;
scanf("%d",&T);
int a,b,n,m;
while(T--){
scanf("%d%d%d%d",&a,&b,&n,&m);
long long h,ans;
h=Lucas(n-1,m-1);
// cout/ cout
cout
}
/标致的小鸽子
10
2 0 5 3
2 3 3 5
5 1 4 6
5 1 6 4
0 2 6 4
2 0 6 4
标致的小鸽子/