当前位置: 代码迷 >> 综合 >> UVA11609-Team---快速幂
  详细解决方案

UVA11609-Team---快速幂

热度:8   发布时间:2023-11-22 09:08:02.0

闲扯,没想到阿里的笔试题居然直接抄了UVA

--------------------------------分割线-----------------------------

题目大意就是从n个人取任意数量(k)的人,在从这个k个人任挑一个队长,有多少中方案,队长不同,人不同都算不同的方案。

这个题得有一种需要一些数学知识,如图

最后结果就是 n* 2^(n-1)

当然也可以这么想,先挑队长,一共n个人,当第i个人当队长时,其他的n-1个人都可以选择进队或者不进队,所以就是2^(n-1)种方案。

好了公式已经有了,接下来就是写一个快速幂,快速幂的讲解有一个大佬讲的很好我这里直接贴出来https://blog.csdn.net/Harington/article/details/87602682

这里就贴一下快速幂的代码

typedef long long ll
ll quickpow(ll a, ll b, ll m){ll ans = 1;while(b > 0){if(b & 1){ans = ans * a % m;}a = a * a % m;b >>= 1; } return ans;
}

本题AC代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>
#define M 1000000007
using namespace std;
long long quickpow(long long n){if(!n) return 1;long long  sum =1,tmp=2;while(n){if(n&1){sum = sum*tmp;sum%=M;}tmp*=tmp;tmp%=M;n>>=1;}return sum;
}
int main(){long long  n;scanf("%lld",&n);long long ans = quickpow(n-1);ans = (ans*n)%M;printf("%lld\n",ans);
}

 

  相关解决方案