D
小红的整数转换
https://ac.nowcoder.com/acm/contest/71593/A
代码写的比较丑,这道题的思路就是先用不管取不取红蓝硬币,先算出混取凑出面值为p的方案数,然后算出只取红硬币凑出的面值方案数,最后算出只取蓝硬币凑出的方案数,最后就是把混取面值为p的方案数减去只取红或蓝得到面值为p的方案数,这样得到的一定就是有红有蓝的方案了,最后取模就好了
int fa[MAXN],fb[MAXN],fc[MAXN];
void solve() {
int n,p;cin>>n>>p;
string str;cin>>str;str=' '+str;
for(int i=1;i<=n;i++) cin>>c[i];
vector<int>va,vb;
for(int i=1;i<=n;i++){
if(str[i]=='B') vb.push_back(i);
else va.push_back(i);
}
int ida=1;
for(auto it:va) a[ida]=c[it],ida++; ida--;
int idb=1;
for(auto it:vb) b[idb]=c[it],idb++; idb--;
fa[0]=1;
for(int i=1;i<=ida;i++){
for(int j=p;j>=a[i];j--){
fa[j]=(fa[j]+fa[j-a[i]])%mod;
}
}
fb[0]=1;
for(int i=1;i<=idb;i++){
for(int j=p;j>=b[i];j--){
fb[j]=(fb[j]+fb[j-b[i]])%mod;
}
}
fc[0]=1;
for(int i=1;i<=n;i++){
for(int j=p;j>=c[i];j--){
fc[j]=(fc[j]+fc[j-c[i]])%mod;
}
}
cout<< (((fc[p]-fb[p]-fa[p])%mod)+mod)%mod <<endl;
}