1 条题解
-
1
将T在S中看做一个整体
$$ C_{tt}^{st[a]}*C_{tt-st[a]}^{st[b]}*...C_{tt-st[a]-st[b]-...-st[y]}^{st[z]}*C_1^1 $$
设为字母总数 为第个字符在在S中数量
答案就为意为从tt个位置中选st[i]个位置放第i个字符
CODE
#include<bits/stdc++.h> using namespace std; #define int long long const int MOD=1000000007; string s1/*S*/,s2/*T*/; int a[100010]/*阶乘*/,st[28]/*每个字母在S中出现次数(27是T)*/; long long mpow(long long y,int z){ y%=MOD;long long ans=1; for(int i=z;i;i>>=1,y=y*y%MOD) if(i&1) ans=ans*y%MOD; return ans; } long long C(long long n,long long m){ if(m>n) return 0; return (a[n]*mpow(a[m],MOD-2))%MOD*mpow(a[n-m],MOD-2)%MOD; } main(){ ios::sync_with_stdio(0); cin.tie(0); a[0]=1; for (int i=1;i<=100000;i++){ a[i]=i*a[i-1]%MOD; a[i]%=MOD; } int t;cin>>t; while(t--){ cin>>s1>>s2; memset(st,0,sizeof(st)); bool fl=0;int tt=0/*字母总数*/; for(int i=0;i<(int)s1.length();++i){ ++st[s1[i]-'a'+1];++tt; } for(int i=0;i<(int)s2.length();++i){ --st[s2[i]-'a'+1];if(st[s2[i]-'a'+1]<0){fl=-1;break;} --tt; } st[27]=1;++tt; if(fl){ printf("0\n"); continue; } long long ans=1; for(int i=1;i<=27;++i){ if(!st[i]) continue; ans*=C(tt,st[i]);ans%=MOD; tt-=st[i]; } printf("%lld\n",ans); } return 0; }
信息
- ID
- 806
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 27
- 已通过
- 6
- 上传者