2019牛客多校第一场B - Integration(题解)

登录—专业IT笔试面试备考平台_牛客网

https://ac.nowcoder.com/acm/contest/881/B

题目要求

这里我们需要进行列项,列项的方法是部分分式展开法。

部分分式展开法

这部分内容可以参考《信号与系统》这门课当中的复频域分析部分。(这题据说也可参考《复变函数》当中的留数定理)

假设分式分别是关于的多项式。

分母可以进行因式分解:

这里的了零点,也是的极点,当它们互不相等的时候,可以表示为

式子里,为待定系数,在等式两边同时乘以因子,再令,于是右边只留下了项:

本题题解

观察我们要列项的式子,可以认为,接着利用部分分式展开得到

接下来对于展开的每一项分别积分后求和,每一项分别是

注意对求逆元的时候先把分母全部相乘再求逆元,这样只需要求一次。

整个算法的渐进时间复杂度为

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int MAX_N = 1000 + 5;
const LL P = LL(1E9) + 7;

int n;
LL a[MAX_N];

inline LL getPow(LL x, LL y, LL mod) {
    LL ret = 1;
    while (y) {
        if (y & 1) ret = ret * x % mod;
        x = x * x % mod;
        y >>= 1;
    }
    return ret;
}

inline LL sub(LL u, LL v) {
    return ((u - v) % P + P) % P;
}

inline LL getC(int x) {
    LL ret = 1;
    for (int i = 1; i <= n; ++i) {
        if (i == x) continue;
        ret = ret * sub(a[i] * a[i], a[x] * a[x]) % P;
    }
    ret = getPow(ret, P - 2, P);
    return ret;
}

int main() {
    while (scanf("%d", &n) != EOF) {
        for (int i = 1; i <= n; ++i) scanf("%lld", a + i);
        LL sum = 0;
        for (int i = 1; i <= n; ++i) {
            LL ans = 1;
            ans = ans * getC(i) % P;
            ans = ans * getPow(a[i] << 1, P - 2, P) % P;
            sum = (sum + ans) % P;
        }
        printf("%lld\n", sum);
    }
    return 0;
}

我的博客

www.cfzhao.com
(欢迎dalao们py友链接啊!)

所以对于每个 i 要找到满足 p(j) <= sum - p(i) 的 j 有几个
于是可以把所有的 p(i) 和 sum - p(i) 离散化,树状数组,

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务