1. 程式人生 > >UVA 11609 (組合數學)

UVA 11609 (組合數學)

題意:求sigma(i*C(n, i)).

因為i*C(n, i) = i*n*(n-1)*...*(n-i+1)/i! = n*(n-1)*...*(n-2+1)/(i-1)! = (n-i+1)*C(n, i-1),

所以(i-1)*C(n,i-1)+i*C(n, i) = n*C(n, i-1),所以這個求和式的沒兩項都能合併,提出一個

n的公約數後,最後就是n*[C(n,0)+C(n,2)+C(n,4)+...] = n*2^(n-1).奇偶的情況是一樣

的都是這個結果.

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
using namespace std;
const long long mod = 1e9+7;

long long n;

long long qpow (long long a, long long b) {
    if (b == 0)
        return 1;
    long long ans = qpow (a, b>>1);
    ans = ans*ans % mod;
    if (b&1) ans = ans*a%mod;
    return ans;
}

int main () {
    int t, kase = 0;
    cin >> t;
    while (t--) {
        cin >> n;
        printf ("Case #%d: ", ++kase);
        cout << (n*qpow (2, n-1))%mod << endl;
    }
    return 0;
}