[题解]P10185 [YDOI R1] Necklace

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;
}
posted @ 2025-08-14 12:02  Sinktank  阅读(11)  评论(0)    收藏  举报
★CLICK FOR MORE INFO★ TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.