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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


正題

題目鏈接:https://www.luogu.com.cn/problem/P4593


題目大意

場上有若干只怪,最高的為nnn,每個怪血量不同,有mmm個血量不存在。

不停釋放褻瀆(全場打一,如果有怪死亡就再次生效),每次一個怪被攻擊會產生價值xkx^kxkxxx是該怪褻瀆前的血量,kkk是打完總共需要釋放的褻瀆數量)。

求價值和


解題思路

直接扭了輸出價值和為0

首先可以知道k=m+1k=m+1k=m+1

然后先不考慮空位答案產生的影響,第一次褻瀆產生的代價為∑i=1nik\sum_{i=1}^ni^ki=1n?ik

然后考慮空位位置開始褻瀆,如果開始位置為qqq,那么代價為∑i=1n?qik\sum_{i=1}^{n-q}i^ki=1n?q?ik

然后減去產生的影響,對于第一次褻瀆需要減去的是aika_i^kaik?

然后對面后面減去的是∑i=1n∑j=i+1naiaj?ai\sum_{i=1}^n\sum_{j=i+1}^na_{i}^{a_j-a_i}i=1n?j=i+1n?aiaj??ai??

考慮如何計算∑i=1xik\sum_{i=1}^xi^ki=1x?ik,我們可以知道這個是一個x+1x+1x+1項的kkk次函數,我們可以先求出1~x+21\sim x+21x+2的點,用拉格朗日差值計算答案即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=60,XJQ=1e9+7; ll n,m,k,T,ans; ll f[N],fac[N],a[N]; ll power(ll x,ll b){ll ans=1;x%=XJQ;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans; } ll slove(ll x){if(x<=k+2)return f[x];ll ans=0;for(ll i=1;i<=k+2;i++){ll y=f[i];for(ll j=1;j<=k+2;j++){if(i==j)continue;(y*=(x-j+XJQ)%XJQ*power(i-j+XJQ,XJQ-2)%XJQ)%=XJQ;}(ans+=y)%=XJQ;}return ans; } int main() {fac[0]=1;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%XJQ;scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&m);for(ll i=1;i<=m;i++)scanf("%lld",&a[i]);k=m+1;sort(a+1,a+1+m);while(a[m]==n)n--,m--,k--;for(ll i=1;i<=k+2;i++)f[i]=(f[i-1]+power(i,k))%XJQ;ans=slove(n);for(ll i=1;i<=m;i++)(ans+=slove(n-a[i]))%=XJQ;for(ll i=1;i<=m;i++)(ans+=XJQ-power(a[i],k))%=XJQ;for(ll i=1;i<=m;i++)for(ll j=i+1;j<=m;j++)(ans+=XJQ-power(a[j]-a[i],k))%=XJQ;printf("%lld\n",ans);} }

總結

以上是生活随笔為你收集整理的P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】的全部內容,希望文章能夠幫你解決所遇到的問題。

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