定義乙個長為k的序列a1,a2,…,ak的權值為:對於所有1≤i≤k,max(a1,a2,…,ai)有多少種不同的取值。
給出乙個1到n的排列b1,b2,…,bn,求b的所有非空子序列的權值的m次方之和。
答案對109+7取模。
第一行兩個整數n、m。
接下來一行n個整數,第i個整數為bi。
輸出乙個整數,表示答案。
示例1輸入
3 21 3 2
輸出16
說明在所有非空子序列中:
(1), (3), (2), (3, 2)權值為1,
(1, 3), (1, 2), (1, 3, 2)權值為2。
那麼所有非空子序列權值的2次方和為4×12+3×22=16。
備註:對於前10%的資料,n≤20。
對於前20%的資料,n≤100。
對於前40%的資料,n≤1000。
對於另外20%的資料,m=1。
對於所有資料,1≤n≤105,1≤m≤20,保證b是1到n的排列。
分析直接求看樣子是不可能的,出題人這輩子都不可能讓你直接求的
所以考慮從左到右乙個乙個加入數。
當加入乙個數的時候,只有最大值小於這個數的子串行,權值才會被更新(即加1)
我們不可能把每個子串行的權值都求出來後才乘方再加起來,鐵定會t
但我們根據二項式定理,可以發現對於任意乙個數x
$$(x+1)^m=c_^x^+c_^x^+c_^x^+\cdots\cdots+c_^x^+c_^x^+c_^x^$$
通過這個
我們可以通過維護每個子串行權值的m次方和,m-1次方和,m-2次方和。。。。。。1次方和,0次方和,就可以通過上面的公式得到這些子串行權值集體加1後的乘方的和
由於每次插入值的時候更新只跟最大值有關,而且題目中保證了b是乙個排列。
所以,我們可以把最大值相同的子串行一起處理,維護它們的m次方和,m-1次方和,m-2次方和。。。。。。
加入乙個新的數的時候,找到所有最大值比它小的子串行,將它們的m次方和,m-1次方和。。。。。。加起來,再用二項式定理得到加1後的m次方和,得到一組新的子串行的資訊
對於那些最大值比它的子串行,因為無法更新但可以形成新的子串行,直接將和乘以2就好了
這個可以用線段樹維護,線段樹的每個位置維護相同最大值的子串行的一些資訊
code
#include#includeconst
int mod=1e9+7
;const
int maxn=100005
;int n,m,ans,a[maxn],tmp[30],pre[30],c[30][30],sum[maxn<<2][30],mk[maxn<<2][30
];void pushdown(int id,int l,int r,int
k)void add(int id,int l,int r,int x,int v,int
k)
int mid=(l+r)>>1
;pushdown(id,l,r,k);
x<=mid?add(id<<1,l,mid,x,v,k):add(id<<1|1,mid+1
,r,x,v,k);
sum[id][k]=(sum[id<<1][k]+sum[id<<1|1][k])%mod;
}int que(int id,int l,int r,int x,int
k)void mul(int id,int l,int r,int x,int
k)
int mid=(l+r)>>1
;pushdown(id,l,r,k);
x<=mid?mul(id<<1,l,mid,x,k),1:0
; mul(id
<<1|1,mid+1
,r,x,k);
sum[id][k]=(sum[id<<1][k]+sum[id<<1|1][k])%mod;
}int
main()
scanf(
"%d%d
",&n,&m);for(int i=0;i<=n<<2;i++)for(int k=0;k<=m;k++)mk[i][k]=1
;
for(int i=1;i<=n;i++)
printf("%d
",(que(1,1,n,n,m)%mod+mod)%mod);
}
牛客 傷害計算 排列計算
給你乙個由 號分割的字串,每一段可能是純整數,那麼直接相加即可,也可能是由乙個整數a加 d 加乙個整數b組成,表示投擲a次有b面的篩子,結果加上它的期望 直接記錄每個 號位置,然後將字串分割出來,按題意模擬即可,期望公式就是 b 1 b 2a b includeusing namespace std...
線段樹 貪心 F 排列計算
天才程式設計師菜哭武和石頭組隊參加乙個叫做國際排列計算競賽 international competition of permutation calculation,icpc 的比賽,這個比賽的規則是這樣的 乙個選手給出乙個長度為 n 的排列,另乙個選手給出 m 個詢問,每次詢問是乙個形如 l,r ...
sequence 牛客 ( 線段樹)
題面 your are given two sequences a1 n,b1 n a b a1 n b1 n you need to answer max 1 l r n displaystyle max times sum b 1 l r nmax 1e 6 b i 1e 6 1e6 1 e6 ...