闲扯,没想到阿里的笔试题居然直接抄了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);
}