“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)D--Deploy the medical team(排列组合+快速幂)
地址:https://ac.nowcoder.com/acm/contest/5523/D


题意:n个人,m个人可以成为队长。队长不同的队伍视为不同队伍。问可以组成的队伍数。
解析:推一下,就是m*(Cn-1 ,1+ Cn-1 , 2+Cn-1 ,3+.......+Cn-1 , n-1 +1)然后需要知道一个高中排列组合学到的知识点:Cnm,1<=m<=n,那么(Cn,1+Cn,2+...+Cn , n)总和就是2^n - 1。所以本题就是:m*(2^(n-1)-1+1)=m*(2^(n-1))。套一下快速幂就可以了。
#include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int mod=1e9+7; int qk(ll a, ll b,ll c) { ll ans=1; a=a%c; while(b) { if(b%2==1) ans=(ans*a)%c; b=b/2; a=(a*a)%c; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { ll n,m; scanf("%lld%lld",&n,&m); cout<<m*(qk(2,n-1,mod))%mod<<endl; } }

浙公网安备 33010602011771号