(一)
考虑对每一种颜色单独求解。
对于一次第 \(k\) 种的“循环”,美丽度会加上
\[\sum_{i=1}^{a_k}C_{n}^{i}\times v_k^{i}=(v_k+1)^{a_k}-1 \]相信大家都学过二项式定理。
“循环”次数取决于其他珠子是否出现,即 \(2^{\sum_{i=1}^{a_i}-a_k}\)。
再将两式相乘就愉快 AC 了。
(二)
警钟敲烂:注意输入格式。
我调了 \(1\) 天。
(三)
AC 代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200010],v[200010],ans,pw[200010];
const int md=1e9+7;
int pow(int x,int y){
int ss=1;
while(y){
if(y&1)ss=ss*x%md;
x=x*x%md;
y>>=1;
}
return ss;
}
signed main(){
scanf("%lld",&n);
int s=0;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),s+=a[i];
for(int i=1;i<=n;i++)scanf("%lld",&v[i]);
// pw[0]=1;
// for(int i=1;i<=s;i++)pw[i]=pw[i-1]*i%md;
// for(int i=0;i<=a[1];i++)
// for(int j=0;j<=a[2];j++){
// if(i==0&&j==0)continue;
// else if(j==0)ans=(ans+pow(v[1],i)*C(a[1],i)%md)%md;
// else if(i==0)ans=(ans+pow(v[2],j)*C(a[2],j)%md)%md;
// else ans=(ans+((pow(v[1],i)+pow(v[2],j))%md*C(a[1],i)%md*C(a[2],j)%md))%md;
// }
// printf("%lld\n",ans);
// return 0;
for(int i=1;i<=n;i++){
ans=(ans+pow(2ll,s-a[i])*((pow(v[i]+1ll,a[i])-1ll+md)%md)%md)%md;
}
printf("%lld\n",ans);
return 0;
}
标签:md,int,题解,200010,ss,P10185,x%
From: https://www.cnblogs.com/Jh763878/p/18098704