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; }