题意很简单。比C好想一点。
就是叫你求积分
这个我们队积分里面的分式进行处理,根据代数学和待定系数法。
我们可以得到这样一个式子
然后在观察这个式子
剩下的就是系数问题了假设我们求Ak
我们乘一个
然后式子变形成这样
然后令x^2=-ak^2就可以得到Ak了
不要以为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;
}