“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;
    }
}

 

posted @ 2020-04-26 21:49  liyexin  阅读(208)  评论(0编辑  收藏  举报