一个简单的计数问题.
#include <bits/stdc++.h> typedef long long ll; const ll N=5e3+5,M=30; const ll mod=1e9+7; ll s[N],c[N],f[N],g[N],st[M]; ll qp(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } bool cmp(ll x,ll y) { return x>y; } int main() { ll n,m,k; scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=n;i++) { scanf("%lld%lld",&s[i],&c[i]); } f[0]=1; for(int i=0;i<=k;i++) { if(f[i]) { for(int j=1;j<=n;j++) { if(i+s[j]<=k) f[i+s[j]]=(f[i+s[j]]+f[i])%mod; } } } for(int i=1;i<=n;i++) g[c[i]]=(g[c[i]]+f[k-s[i]])%mod; while(m--) { char sc; std::cin>>sc;st[sc-'A']++; } ll ans=1; std::sort(st,st+26,cmp); std::sort(g+1,g+1+n,cmp); for(int i=0;i<26&&st[i];i++) { ll sum=0; for(int j=1;j<=n&&g[j];j++) { sum=(sum+qp(g[j],st[i]))%mod; } ans=ans*sum%mod; } std::cout<<ans<<'\n'; return 0; }