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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2021牛客OI赛前集训营-交替【生成函数】

發布時間:2023/12/3 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客OI赛前集训营-交替【生成函数】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://ac.nowcoder.com/acm/contest/20108/B


題目大意

給出一個長度為nnn的序列aaa,每次

  • 如果nnn是偶數,則對于所有的i<ni<ni<n令新的ai′=ai′+ai+1′a'_i=a'_i+a'_{i+1}ai?=ai?+ai+1?
  • 如果nnn是奇數,則對于所有的i<ni<ni<n令新的ai′=ai′?ai+1′a'_i=a'_i-a'_{i+1}ai?=ai??ai+1?

1≤n≤105,1≤ai≤1091\leq n\leq 10^5,1\leq a_i\leq 10^91n105,1ai?109


解題思路

對于一個位置它操作kkk次之后肯定可以用后面的若干個數表示,設多項式fk(x)=∑i=0∞bixif_k(x)=\sum_{i=0}^{\infty }b_ix^ifk?(x)=i=0?bi?xiap′=∑i=0nbi×ap+ia'_{p}=\sum_{i=0}^nb_i\times a_{p+i}ap?=i=0n?bi?×ap+i?

那么對于這個多項式如果nnn是奇數那么有fk(x)=fk?1(x)×(1+x)f_k(x)=f_{k-1}(x)\times (1+x)fk?(x)=fk?1?(x)×(1+x),否則fk(x)=fk?1(x)×(1?x)f_k(x)=f_{k-1}(x)\times (1-x)fk?(x)=fk?1?(x)×(1?x)

也就是每次(1+x)(1+x)(1+x)(1?x)(1-x)(1?x)交替乘n?1n-1n?1次,如果nnn是奇數,那么
fn?1(x)=((1+x)(1?x))n?12=(1?x2)n?12f_{n-1}(x)=((1+x)(1-x))^{\frac{n-1}{2}}=(1-x^2)^{\frac{n-1}{2}}fn?1?(x)=((1+x)(1?x))2n?1?=(1?x2)2n?1?
用二項式定理拆開暴力算就好了,

如果nnn是偶數就直接再乘個1+x1+x1+x就好了。

時間復雜度:O(n)O(n)O(n)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10,P=1e9+7; ll n,ans,fac[N],inv[N],f[N]; ll C(ll n,ll m) {return fac[n]*inv[m]%P*inv[n-m]%P;} signed main() {scanf("%lld",&n);n--;inv[0]=inv[1]=fac[0]=1;for(ll i=2;i<=n;i++)inv[i]=P-(P/i)*inv[P%i]%P;for(ll i=1;i<=n;i++)inv[i]=inv[i-1]*inv[i]%P,fac[i]=fac[i-1]*i%P;for(ll i=0;i<=n/2;i++)f[i*2]=(i&1)?(P-C(n/2,i)):(C(n/2,i));if(n&1){for(ll i=n;i>=1;i--)f[i]=f[i]+f[i-1];}for(ll i=0,x;i<=n;i++)scanf("%lld",&x),(ans+=f[i]*x%P)%=P;printf("%lld\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的2021牛客OI赛前集训营-交替【生成函数】的全部內容,希望文章能夠幫你解決所遇到的問題。

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