• 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+b[0])%mod << endl;
        return 0;
    }

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

    upd:对不起,代码写错了。。。如上图推导,那一堆东西/(1-a)的部分,a如果是1的话会出现除0的错误,并且a==1时等比数列求和公式也是不能用的。

    在a=1时应该特殊讨论一下。。。这个坑就留给小朋友们啦!加油!冲鸭!

  • 相关阅读:
    sizeof()和 strlen()的区别 --- 个人笔记
    MySQL 生成自增流水号
    sql 逗号分隔列转行
    【转】.NET中lock的使用方法及注意事项
    【转】在一个SQL Server表中一行的多个列找出最大值
    使用 PIVOT 和 UNPIVOT
    List<T>转DataTable
    C# 分数计算类(加减乘除)
    【转】mysql执行计划介绍
    【转】SQL Server 存储:理解IAM 页
  • 原文地址:https://www.cnblogs.com/obob/p/12400162.html
Copyright © 2020-2023  润新知