列表

详情


NC14599. 子序列

描述

给定一个小写字母字符串T

求有多少长度为m的小写字母字符串S满足,T是S的一个子序列(不需要连续)

输入描述

第一行一个字符串T
第二行一个正整数m

输出描述

输出答案对109+7取模的值

示例1

输入:

a
2

输出:

51

说明:

长度为2的里面有a的串有51种

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 2908K, 提交时间: 2019-02-24 23:02:35

#include<stdio.h>
#include<string.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
int m,l;
const int p=1e9+7;
char t[110000];
long long C,ans,inv[110000],p25[110000],p26[110000];
int main(){
	scanf("%s%d",t,&m);
	l=strlen(t);
	p25[0]=p26[0]=1;
	fo(i,1,m){
		p25[i]=p25[i-1]*25%p;
		p26[i]=p26[i-1]*26%p;
	}
	inv[0]=inv[1]=1;
	fo(i,2,m) inv[i]=(p-p/i)*inv[p%i]%p;
	C=1;
	fo(i,l,m){
		ans+=C*p25[i-l]%p*p26[m-i]%p;
		C=C*i%p*inv[i+1-l]%p;
	}
	ans%=p;//!!!!!!! 
	printf("%lld\n",ans);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 19ms, 内存消耗: 480K, 提交时间: 2020-02-29 23:08:10

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
typedef long long LL;
const int mod=1e9+7;
LL bigmod(LL x,LL n)
{
	LL res=1;
	while(n)
	{
		if(n&1) res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
}
char s[100005];
int main()
{
	int n,m;
	scanf("%s %d",s,&n);
	m=strlen(s);
	LL pre=1,ans=0;
	rep(i,m,n)
	{
		ans=(ans+pre*bigmod(25,i-m)%mod*bigmod(26,n-i)%mod)%mod;
		pre=pre*i%mod*bigmod(i-m+1,mod-2)%mod;
	}
	cout<<ans;
}

上一题