日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Polynomial(2019南昌邀请赛)(拉格朗日插值)

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Polynomial(2019南昌邀请赛)(拉格朗日插值) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Polynomial

思路

題目給的是一個nnn次多項式,要我們求∑i=lr\sum\limits_{i = l} ^{r}i=lr?,也就是一個累加的形式,容易想到轉換成求前綴和。

所以我們考慮求前綴和,容易得到這個多項式的前綴和一定是≥n&≤n+1\geq n \& \leq n + 1n&n+1次的多項式,

所以我們必須最少有n+2n + 2n+2個前綴和才能推導,所以我們先通過f(0)?>f(n)f(0) -> f(n)f(0)?>f(n)得到f(n+1)f(n + 1)f(n+1)

然后求個前綴和,再跑mmm次拉個朗日插值得到mmm組的詢問。

由于這是一個xxx連續取值的形式,所以我們可以預處理出前綴積,后綴積,以及階乘逆元,然后即可O(n)O(n)O(n)求得答案。

代碼

/*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f; const double eps = 1e-7;const int N = 1e3 + 10, mod = 9999991;ll y[N], pre[N], suc[N], fac[N], inv[N], k, m;ll quick_pow(ll a, int n) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans; }ll solve(ll n) {pre[0] = suc[k + 2] = 1;for(int i = 1; i <= k + 1; i++) {pre[i] = 1ll * pre[i - 1] * (n - i) % mod;}for(int i = k + 1; i >= 1; i--) {suc[i] = 1ll * suc[i + 1] * (n - i) % mod;}ll ans = 0;for(int i = 1; i <= k + 1; i++) {ll a = 1ll * y[i] * pre[i - 1] % mod * suc[i + 1] % mod, b = 1ll * inv[i - 1] * inv[k + 1 - i] % mod;if((k + 1 - i) & 1) b *= -1;ans = (ans + 1ll * a * b % mod + mod) % mod;}return ans; }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);fac[0] = inv[0] = 1;for(int i = 1; i < N; i++) {fac[i] = 1ll * fac[i - 1] * i % mod;}inv[N - 1] = quick_pow(fac[N - 1], mod - 2);for(int i = N - 2; i >= 1; i--) {inv[i] = inv[i + 1] * (i + 1) % mod;}int T;scanf("%d", &T);while(T--) {scanf("%lld %lld", &k, &m);for(int i = 1; i <= k + 1; i++) {scanf("%lld", &y[i]);}y[k + 2] = solve(k + 2);k++;for(int i = 1; i <= k + 1; i++) {y[i] = (y[i] + y[i - 1]) % mod;}for(int i = 1; i <= m; i++) {int l, r;scanf("%d %d", &l, &r);printf("%lld\n",((solve(r + 1) - solve(l)) % mod + mod) % mod);}}return 0; }

總結

以上是生活随笔為你收集整理的Polynomial(2019南昌邀请赛)(拉格朗日插值)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。