对于一个确定串 s ,求不同子序列的个数有经典dp
fi,si=∑jfi−1,j - fi,j=fi−1,j,j≠si
因为转移都是形式一样的我试着把所有串的 fi 都加起来,然后就发现 Fj 除了 j=ϕ 之外都是一样的,然后就记录两个量,然后就递推出来了
#include<cstdio> #include<cstdlib> #include<algorithm> #include<iostream> using namespace std; typedef long long ll; #define read(x) scanf("%d",&(x)) ll n,m,P; int main(){ freopen("invisible.in","r",stdin); freopen("invisible.out","w",stdout); cin>>n>>m; P=1e9+7; ll x=1,y=0; for (int i=1;i<=n;i++){ ll sum=(x+y*m)%P; x=x*m%P; y=(sum+y*(m-1))%P; } cout<<(x+y*m)%P<<endl; return 0; }