1 条题解

  • 1
    @ 2026-8-28 12:08:47

    将T在S中看做一个整体
    tttt为字母总数 st[i]st[i]为第ii个字符在在S中数量
    答案就为

    $$ C_{tt}^{st[a]}*C_{tt-st[a]}^{st[b]}*...C_{tt-st[a]-st[b]-...-st[y]}^{st[z]}*C_1^1 $$

    Cttst[i]C_{tt}^{st[i]}意为从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
    上传者