今天队内个人赛,碰到这道类似组合数的题,一开始推出个组合数公式,然后就TL。其实这道题有规律,但必须用到2^n,数据量太大,需要用到快速幂把O(n)的复杂度降到O(logn),很遗憾当时并不知道什么是快速幂……
快速幂模版:
/* 非递归形式 */
long long mod_pow(long long x, long long n, int mod) {
long long ret;
while(n > 0) {
x = x % mod;
if (n & 1)
ret = ret*x%mod;
n = n >> 1; // 相当于除以2
x = x * x % mod;
}
return ret;
}
/* 递归形式 */
long long mod_pow(long long x, long long n, int mod) {
if (n == 0) return 1;
long long res = mod_pow((x * x) % mod, n/2, mod);
if (n & 1) res = res * x % mod;
return res;
}
AC代码:
#include <cstdio>
const long long mo = 1000000007;
long long mod_pow(long long x, long long n, long long mod) {
if (n == 0) return 1;
long long res = mod_pow((x * x) % mod, n/2, mod);
if (n & 1) res = res * x % mod;
return res;
}
long long ans(long long n) {
return ((n%mo)*mod_pow(2, n-1, mo))%mo;
}
int main() {
//freopen("input.txt", "r", stdin);
int T;
int n;
int kase = 0;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
printf("Case #%d: %lld\n", ++kase, ans(n));
}
return 0;
}
本文介绍了一种使用快速幂技巧解决大规模组合数计算的方法,通过优化递归和非递归实现,显著降低了时间复杂度。
291

被折叠的 条评论
为什么被折叠?



