B-Integration(待定系数法)

题意很简单。比C好想一点。

就是叫你求积分

\int \frac{1}{\prod (a_{i}^{2}+x^{2})}dx

这个我们队积分里面的分式进行处理,根据代数学和待定系数法。

我们可以得到这样一个式子

\sum \frac{A_{i}}{a_{i}^{2}+x^{2}}=\prod \frac{1}{a_{i}^{2}+x^{2}}

然后在观察这个式子

\frac{A_{1}}{a_{1}^{2}+x^{2}}+\frac{A_{2}}{a_{2}^{2}+x^{2}}+...+\frac{A_{n}}{a_{n}^{2}+x^{2}}=\prod\frac{1}{a_{i}^{2}+x^{2}}

剩下的就是系数问题了假设我们求Ak

我们乘一个a_{k}^{2}+x^{2}

然后式子变形成这样 

(a_{k}^{2}+x^{2})\frac{A_{1}}{a_{1}^{2}+x^{2}}+(a_{k}^{2}+x^{2})\frac{A_{2}}{a_{2}^{2}+x^{2}}+...+A_{k}+...+(a_{k}^{2}+x^{2})\frac{A_{n}}{a_{n}^{2}+x^{2}}=\prod_{i\neq k}\frac{1}{a_{i}^{2}+x^{2}}

然后令x^2=-ak^2就可以得到Ak了

\prod_{i\neq k}\frac{1}{a_{i}^{2}-a_{k}^{2}}

不要以为x^2不能等于负数,这里的x^2只是一个值而已,式子是成立的。

这样求出了系数这道就不难了。

#include "bits/stdc++.h"

using namespace std;
const double eps = 1e-8;
#define lowbit(x) x&-x

int dcmp(double x) {
    if (fabs(x) < eps) return 0;
    return (x > 0) ? 1 : -1;
}

typedef long long ll;
typedef unsigned long long ull;
const ull hash1 = 201326611;
const ull hash2 = 50331653;
const int N = 100000 + 10;
const int M = 2048 + 10;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;

ll n, a[N];
ll k[N], d[N];

ll quick(ll a, ll n) {
    ll ans = 1;
    while (n) {
        if (n & 1) ans = ans * a % mod;
        n >>= 1;
        a = a * a % mod;
    }
    return ans;
}

int main() {
    while (~scanf("%lld", &n)) {
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
        }
        for (int i = 1; i <= n; i++) {
            ll tmp = a[i] * a[i] % mod;
            k[i] = 1;
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                k[i] = k[i] * ((a[j] * a[j] % mod - tmp + mod) % mod) % mod;
            }
            k[i] = k[i] * a[i] % mod;
        }
        ll tt = 1;
        for (int i = 1; i <= n; i++) {
            tt = tt * k[i] % mod;
            d[i] = 1;
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                d[i] = k[j] * d[i] % mod;
            }
        }
        ll p = 0, q = tt;
        q = tt * 2 % mod;
        for (int i = 1; i <= n; i++) p = (p + d[i]) % mod;
        ll ans = p * quick(q, mod - 2) % mod;
        printf("%lld\n", ans);
    }
    return 0;
}
发布了130 篇原创文章 · 获赞 80 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/KXL5180/article/details/96482775