luogu5616 惡魔之樹

2022-06-07 10:51:08 字數 1350 閱讀 5892

記錄$lcm$的質因子狀態(包括大於$\sqrt 300$的質因子),設$f[s]$表示質因子狀態為$s$的$lcm$之和,轉移列舉當前的數$k$,轉移到$lcm(s,k)$即可,時間複雜度為$o(n\cdot |stats|)$($|stats|$會非常大)

優化1:對於乙個$k$,有$2^-1$種方案轉移到$lcm(s,k)$($cnt$為$k$出現次數),而$k$最多300個,因此時間複雜度降為$o(300\cdot |stats|)$

優化2:對於乙個$k$,我們只關心$k$所含有的質因子,也就是說設令$g[s]=\sum_f[s']$(理解一下,$s$中僅表示2,3,5,7,11,13,17以及$k$中含有的大質數,$s'$表示全部狀態,$s\in s'$即在$s$考慮的質數與$s'$對應的質數狀態相同),那麼可以直接在$g$上轉移

答案即求$\sum_f[s]$,由於對於19即以上的質因子,同乙個數$k$不可能同時存在2個/種,因此從小到大列舉質因子,再列舉含有該質因子的數,對於已經其餘的質因子通過上述方式壓縮即可,$|stats|$為17496,複雜度可以通過

1 #include2

using

namespace

std;

3#define n 305

4#define sta 17496

5#define ll long long

6struct

jio;

9int n,x,mod,a[n],vis[n],mi[300005],w[sta],p[7]=;

10 ll ans,f[sta][2

];11

void add(ll &x,int

y)14

inthash(ji k)

17 ji inv_hash(int

k)28

ji dec(ji x,ji y)

33ji mx(ji x,ji y)

38 ji div(int

k)46}47

return

ans;48}

49int

main()61}

62for(int i=1;i<=n;i++)

66 f[0][0]=1;67

for(int i=1;i4;i++)

68if (w[hash(div(i))]==i)

72for(int i=0;i0]=f[i][0]*w[i]%mod;

73for(int i=19;i4;i++)

80for(int j=0;j)84}

85for(int i=0;i0

]);86 printf("%d"

,ans);

87 }

view code

561 陣列拆分I

給定長度為 2n 的整數陣列 nums 你的任務是將這些數分成 n 對,例如 a1,b1 a2,b2 an,bn 使得從 1 到 n 的 min ai,bi 總和最大。返回該最大總和 示例 1 輸入 nums 1,4,3,2 輸出 4 解釋 所有可能的分法 忽略元素順序 為 1,4 2,3 min ...

561 陣列拆分 I

給定長度為 2n 的整數陣列 nums 你的任務是將這些數分成 n 對,例如 a1,b1 a2,b2 an,bn 使得從 1 到 n 的 min ai,bi 總和最大。返回該 最大總和 示例 1 輸入 nums 1,4,3,2 輸出 4 解釋 所有可能的分法 忽略元素順序 為 1.1,4 2,3 m...

mysql 5 6 1 安裝教程

在ubuntu下安裝mysql5.6.13確沒那麼簡單了。然後安裝教程 都是英文。安裝開始 shell groupadd mysql shell useradd r g mysql mysql shell cd usr local shell tar zxvf path to mysql versi...