2017清华机试题——多项式求和(polynomial)

看完了题目 让我们来推导一下公式吧! 

 推完了公式辣,来分析一下复杂度。

O(R(n,i)) = O(R(n-1,i-1)) + O(R(n-1,i-2)) + ...

这东西是递归的,递归基是i=0或n=0。

所以,复杂度是O(i^2)的!i的大小最大是100(i的上限是m)。。。听起来这个复杂度还有点合理。

接下来就写代码。

code:

#include <bits/stdc++.h>
using namespace std;

long long mod = 1e9 + 7;
long long b[105];
long long power(long long num,long long k) {
    num %= mod;
    long long ans = 1;
    while(k) {
        if(k & 1) ans = ans * num % mod;
        k >>= 1;
        num = num * num % mod;
    }
    return ans;
}
long long C(int x,int y) {
    //懒得写复杂度低的了,反正就100
    long long ans = 1;
    for(int i = 0;i < y;++i) {
        ans = ans * (x-i) % mod;
        ans = ans * power(i+1,mod-2) % mod;
    }
    return ans;
}
long long a;
long long R(long long n,long long k) {
    if(n == 0) {
        if(k == 0) return 1;
        return 0;
    }
    if(k == 0) {
        long long ans = (power(a,n+1)-a+mod)%mod;
        ans = ans * power(a-1,mod-2) % mod;
        return ans;
    }

    long long ans = (a - power(a,n+1)*power(n,k)%mod + mod ) % mod;
    for(int i = 0;i <= k-1;++i) {
        ans = (ans + a * C(k,k-i) % mod * R(n-1,i)) % mod;
    }
    ans = mod - ans;
    ans = ans * power(a-1,mod-2) % mod;
    return ans;
}

int main() {
    long long n,m;
    cin >> n >> m >> a;
    long long ans = 0;
    for(int i = 0;i <= m;++i) {
        scanf("%lld",&b[i]);
        ans += b[i] * R(n,i) % mod;
        ans %= mod;
    }
    cout << (ans+1)%mod << endl;
    return 0;
}

 对了下样例,反正样例都对了,假装自己已经ac

猜你喜欢

转载自www.cnblogs.com/obob/p/12400162.html