記錄$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 #include2view codeusing
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 }
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...