#include<bits/stdc++.h> using namespace std; #define MAXN 1010 typedef long long LL; const LL mod = 1e9 + 7; LL powmod(LL aa, LL x) { LL res = 1; for(; x > 0; x >>= 1) { if(x & 1)res = (res * aa) % mod; aa = (aa * aa) % mod; } return res; } struct lagrange { #define ll long long #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define D 2010 //D比MAXN大100就行 ll a[D], f[D], g[D], p[D], p1[D], p2[D], b[D], h[D][2], C[D]; void init(int M) {//初始化:参数填MAXN + 20 f[0] = f[1] = g[0] = g[1] = 1; rep(i, 2, M + 5) f[i] = f[i - 1] * i % mod; g[M + 4] = powmod(f[M + 4], mod - 2); per(i, 1, M + 4) g[i] = g[i + 1] * (i + 1) % mod; } /*给定一组样本数据a[],规模为0-d,计算出第n项*/ ll calcn(int d, ll *a, ll n) { if (n <= d) return a[n]; p1[0] = p2[0] = 1; rep(i, 0, d + 1) { ll t = (n - i + mod) % mod; p1[i + 1] = p1[i] * t % mod; } rep(i, 0, d + 1) { ll t = (n - d + i + mod) % mod; p2[i + 1] = p2[i] * t % mod; } ll ans = 0; rep(i, 0, d + 1) { ll t = g[i] * g[d - i] % mod * p1[i] % mod * p2[d - i] % mod * a[i] % mod; if ((d - i) & 1) ans = (ans - t + mod) % mod; else ans = (ans + t) % mod; } return ans; } /* 给定一组观测点(0, a[0]), (1, a[1]), ...,(m, a[m]),、 样本点的个数为a(x)的最高次+1。 求在该函数模型下,a[0]+a[1]+...+a[n]的和。 */ ll ta[D]; ll polysum(ll m, ll *a, ll n) { // 给定a[0].. a[m],求\sum_{i=0}^{n}a[i] memcpy(ta, a, sizeof(a[0]) * (m + 1)); ta[m + 1] = calcn(m, ta, m + 1); rep(i, 1, m + 2)ta[i] = (ta[i - 1] + ta[i]) % mod; return calcn(m + 1, ta, n); } };