您的位置:首页 > 汽车 > 时评 > 组合数求法

组合数求法

2024/9/8 10:27:51 来源:https://blog.csdn.net/hui_le4/article/details/140503886  浏览:    关键词:组合数求法

885. 求组合数 I - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int d[2010][2010];int main()
{int n;cin>>n;for(int i=0;i<=2000;i++)for(int j=0;j<=i;j++)if(j==0||j==i) d[i][j]=1;else  d[i][j]=(d[i-1][j-1]+d[i-1][j])%mod;while(n--){int a,b;cin>>a>>b;cout<<d[a][b]<<endl;}
}

886. 求组合数 II - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define  int long long 
const int mod=1e9+7;
int fact[N],infact[N];int qmi(int a,int b,int c)
{   int res=1;while(b){if(b&1) res=res*a%c;b>>=1;a=a*a%c;}return res;}signed main()
{int n;cin>>n;fact[0]=infact[0]=1;for(int i=1;i<N;i++){fact[i]=fact[i-1]*i%mod;infact[i]=infact[i-1]*qmi(i,mod-2,mod)%mod;}while(n--){int a,b;cin>>a>>b;cout<<fact[a]*infact[b]%mod*infact[a-b]%mod;cout<<endl;}
}

887. 求组合数 III - AcWing题库

#include<bits/stdc++.h>
using namespace std;
#define int long longint qmi(int a,int b,int c)
{int res=1;while(b){if (b&1) res=res*a%c;b>>=1;a=a*a%c;}return res;
}
int ans(int a,int b,int c)
{if(b>a) return 0;int res=1;for(int i=1,j=a;i<=b;i++,j--){res=res*j%c;res=res*qmi(i,c-2,c)%c;}return res;}
int lucas(int a,int b,int c)
{if(a<c&&b<c) return ans(a,b,c);else return ans(a%c,b%c,c)*lucas(a/c,b/c,c)%c;
}signed main()
{int n;cin>>n;while(n--){int a,b,p;cin>>a>>b>>p;cout<<lucas(a,b,p)<<endl;}
}

888. 求组合数 IV - AcWing题库

#include<bits/stdc++.h>
using namespace std;const int N=5010;
bool st[N];
int prime[N],cnt=0;
int sum[N];void get_prime(int n)
{for(int i=2;i<=n;i++){ if(!st[i]) prime[cnt++]=i;for(int j=0;prime[j]<=n/i;j++){st[prime[j]*i]=1;if(i%prime[j]==0) break;}}
}int get(int n,int p)
{int res=0;while(n){res+=n/p;n/=p;}return res;
}vector<int> mul(vector<int> a, int b)
{vector<int> c;int t = 0;for (int i = 0; i < a.size(); i ++ ){t += a[i] * b;c.push_back(t % 10);t /= 10;}while (t){c.push_back(t % 10);t /= 10;}// while(C.size()>1 && C.back()==0) C.pop_back();//考虑b==0时才有pop多余的0 b!=0不需要这行return c;
}signed main()
{int a,b;cin>>a>>b;get_prime(a);for(int i=0;i<cnt;i++){int p = prime[i];sum[i] = get(a,p)-get(a-b,p)-get(b,p);//是a-b不是b-a}vector <int>ans;ans.push_back(1);for(int i=0;i<cnt;i++)for(int j=0;j<sum[i];j++)ans=mul(ans,prime[i]);for(int i=ans.size()-1;i>=0;i--){cout<<ans[i];}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com