[题解]P10185 [YDOI R1] Necklace
容易写出答案为:
\[\large\sum\limits_{i=1}^n\Big(2^{S-a_i}\sum\limits_{j=1}^{a_i}(C_{a_i}^j\times v_i^j)\Big)
\]
其中 \(S\) 为 \(a_i\) 之和。
解释:第 \(i\) 种珠子被选 \(j\) 次时,其他种类的珠子可以随意选择(\(2^{S-a_i}\)),\(i\) 种类的珠子从 \(a_i\) 中选 \(j\) 个(\(C_{a_i}^j\)),产生 \(v_i^j\) 的贡献。
内部的 \(\sum\) 不是非常好求,不过我们有二项式定理:
\[\large(a+b)^n=\sum\limits_{i=0}^n C_n^i\times a^i\times b^{n-i}
\]
那么我们可以尝试化成二项式定理的形式:
\[\large\begin{aligned}
&\quad\sum\limits_{j=1}^{a_i}(C_{a_i}^j\times v_i^j\times 1^{a_i-j})\\
&=(v_i+1)^{a_i}-1
\end{aligned}\]
快速幂即可解决。
于是答案就是:
\[\large\sum\limits_{i=1}^n\Big(2^{S-a_i}\times ((v_i+1)^{a_i}-1)\Big)
\]
时间复杂度 \(O(n(\log n+\log S))\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,P=1e9+7;
int n,a[N],v[N],s,ans;
int qp(int a,int n){
int f=1;
while(n){
if(n&1) f=f*a%P;
a=a*a%P,n>>=1;
}
return f;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s+=a[i];
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++){
(ans+=(qp(v[i]+1,a[i])-1+P)%P*qp(2,s-a[i]))%=P;
}
cout<<ans<<"\n";
return 0;
}
浙公网安备 33010602011771号