1. 程式人生 > >2017/3/4

2017/3/4

有一個 。。 公式 span 方向 OS clas 是個 量變

  今天好像是NESCAFE系列

T1 異化多肽

  這個應該還是比較簡單的,就是先弄出DP的轉移方程,然後弄成多項式的形式: F[i] 表示進行第 i 次加入氨基酸的生成函數,那麽久很容易得到F[i]=F[i]*H+1, H就是根據初始的氨基酸的質量來統計出來的數組,雖然 F[i] 的每一項不是僅僅從前一項轉移過來,但是當 i 趨於正無窮的時候,那麽 F 這個多項式在 mod x^n 的意義下是穩定不變的,然後就多項式求逆就行了

T2 編碼病毒

  這個題就是看起來比較的嚇人,弄了一個看起來很麻煩的校驗公式,但是手動模擬一下就可以得到,其實 X1, C 就是把data平移了幾位,然後 X2 支持將data串取反,考慮暴力的話就是暴力O(n)的枚舉每一種平移的狀態,然後通過已有的對應位數量來判斷將這個狀態的兩個串變成一樣所需要的變化步數,然後在計算出平移到這個位置需要的最小步數,將兩者相加,然後對所有的和取 min 就好了。

  然後正解的話就是把暴力算兩個串的匹配數量變成用 NTT 優化就好了

  有一個值得註意的地方就是,同一方向上,平移(i+n)步可能會比平移 i 步更優,因為 (i+n)的二進制數中1的個數可能會更少。。。。

  還有兩個值得註意的地方就是,雖然公式裏給的是 Test=Data... 但是輸入裏是先給的Data,再給的Test,然後不按套路的,先給的m後給的n,然後我就弄反了

T3 數論函數簇

  這個題的話,首先把柿子展開: a*(a*x+b)+b=a*x+b (mod n)

  然後就可以發現移項可以發現兩個條件 1、a*(a-1)=0 (mod n) 2、a*b=0(mod n)

  假設現在a確定,那麽設d=gcd(a,b),則b=k*n/gcd --> k=n/(n/gcd)=gcd

  然後就可以O(n^2)枚舉得到20分。

  50分的話就是因為n|a*(a-1),設p*q==n && gcd(p,q)==1,a=k1*p,b=k2*q --> k1*p-1=k2*q

  然後加強一下條件就是k1*q=1(mod q)

  然後因為k1*p<n --> k1<n/p --> K1<q

  然後根據什麽歐幾裏德定理就可以知道這玩意只有唯一解

  那麽就是對於每一個合法的P && P<n 都會有gcd(p,n)=p的貢獻

  然後類似於二項式定理的辦法,答案就是 ∏(Pi^ai+1)其中p是n的因子,因為p==n時是不合法的,所以要在-n

  設R(i)=∏(Pi^ai+1)-n,那麽R(i)+n是積性函數,可以先篩。

  滿分的話就是先把n瞥到一邊,然後Σ(i<=n)Σ(d|i)Σ(k|d,k|i/d)μ(k)*d 反演一下

  最後的到這個柿子Σμ(k)*i*k*[n/i(k^2*i)],然後前面有貢獻的範圍是到sqrt(n),後面是個log,就可以拿到100分啦

2017/3/4