PE427.n-sequences
阿新 • • 發佈:2020-08-11
題目大意
定義一個串的值為最長相同子串長度,求所有長度為n的每項為[1,n]的所有串的值之和模1e9+9
題解
推完就對了很奇妙
先求至多為m的答案
\(ans_m=[x^n]n\sum_{i=0}^{\infty} (n-1)^i(\sum_{j=1}^m x^j)^{i+1}\)
\(=[x^n]\frac{n}{n-1}\sum_{i=1}^{\infty} (n-1)^i(\sum_{j=1}^m x^j)^i\)
設\(F=(n-1)\sum_{i=1}^m x^i=(n-1)\frac{x^{m+1}-x}{x-1}\)
\(ans_m=[x^n]\frac{n}{n-1}\sum_{i=1}^{\infty} F^i\)
\(=[x^n]\frac{n}{n-1}*\frac{F}{1-F}\)
\(=[x^n]\frac{n}{n-1}*(\frac{1}{1-F}-1)\)
-1沒有影響可以去掉
\(=[x^n]\frac{n}{n-1}*\frac{1-x}{1-(nx-(n-1)x^{m+1})}\)
分母展開成無窮級數,列舉\(-(n-1)x^{m+1}\)的次數來計算,\(nx\)的次數就用\(n\)減一下得到
因為實際上是個\((a+b)^i\)的形式,所以當b的次數和總次數確定時只有一項算到
列舉m,時間複雜度是調和級數的形式,預處理冪可以做到O(n log n),跑6s左右
最後的\(Ans=\sum_i i*(ans_i-ans_{i-1})\)
code
#pragma GCC optimize(3) #include <bits/stdc++.h> #define fo(a,b,c) for (a=b; a<=c; a++) #define fd(a,b,c) for (a=b; a>=c; a--) #define C(n,m) (jc[n]*Jc[m]%mod*Jc[(n)-(m)]%mod) #define add(a,b) a=((a)+(b))%mod #define mod 1000000009 #define Mod 1000000007 #define ll long long #define file using namespace std; ll jc[7500001],Jc[7500001],Ans[7500001],p1[7500001],p2[7500001],ans; int n,i,j,k,l; ll qpower(ll a,int b) {ll ans=1; while (b) {if (b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;} return ans;} int main() { #ifdef file freopen("PE427.in","r",stdin); #endif scanf("%d",&n); jc[0]=1; fo(i,1,n) jc[i]=jc[i-1]*i%mod; Jc[n]=qpower(jc[n],Mod); fd(i,n-1,0) Jc[i]=Jc[i+1]*(i+1)%mod; p1[0]=p2[0]=1; fo(i,1,n) p1[i]=p1[i-1]*(-(n-1))%mod,p2[i]=p2[i-1]*n%mod; fo(i,1,n) { fo(j,0,n) if ((i+1)*j<=n) { add(Ans[i],p1[j]*p2[n-(i+1)*j]%mod*C(j+(n-(i+1)*j),j)); if ((i+1)*j<n) add(Ans[i],-p1[j]*p2[n-(i+1)*j-1]%mod*C(j+(n-(i+1)*j-1),j)); } else break; } fo(i,1,n) add(ans,(Ans[i]-Ans[i-1])*i); printf("%lld\n",(ans+mod)%mod*n%mod*qpower(n-1,Mod)%mod); fclose(stdin); fclose(stdout); return 0; }