日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 264B Good Sequences ★ (分解素因子+DP)

發布時間:2024/10/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 264B Good Sequences ★ (分解素因子+DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://codeforces.com/problemset/problem/264/B 題目大意:給定一個數列a1,a2,a3,a4,……,an(數據保證ai嚴格遞增,n<=10^5),求最長的good序列長度:①序列嚴格遞增 ?②序列相鄰兩數不能互素. ? 題目乍一看好像是nlogn二分+DP的最長上升子序列,但其實這題和LIS一點兒關系都沒有……因為數列本身就是嚴格遞增的. 但是此題還需要借鑒LIS的思想,獨特的是我們把素因子作為DP的狀態,c[pi]表示前面以素數pi為因子的數結尾的最長序列的長度,f[i]表示以第i個數結尾的最長序列的長度。然后我們從左到右掃描序列,每次對當前第i個數分解素因子p1,p2,p3,……pn,找到其中c[pi]最大的,那么我們把此數連到該序列尾便形成了以該數為結尾的最長的good序列。注意完了之后還需要再更新各c[pi]。 ? #include #include #include #include using namespace std; #define MAX 100010 int a[MAX],f[MAX],c[MAX]; bool noprime[MAX]; vector prime; int gcd(int a, int b){return b?gcd(b, a%b):a; } void Prime(){for (int i = 2; i <= 100000; i ++){if (!noprime[i]){prime.push_back(i);}for (int j = 0; j < prime.size() && prime[j] * i <= 100000; j ++){noprime[prime[j]*i] = 1;if (i % prime[j] == 0) break;}} } int main(){Prime();int n;cin >> n;for (int i = 0; i < n; i ++){cin >> a[i];int tmp = a[i];f[i] = 1;for (int j = 0; j < prime.size(); j ++){int p = prime[j];if (p * p > tmp)break;if (tmp % p == 0){f[i] = max(f[i], c[p] + 1);while(tmp % p == 0)tmp /= p;}}if (tmp > 1){f[i] = max(f[i], c[tmp] + 1);}for (int j = 0; j < prime.size(); j ++){int p = prime[j];if (p * p > a[i])break;if (a[i] % p == 0){c[p] = f[i];while(a[i] % p == 0)a[i] /= p;}}if (a[i] > 1){c[a[i]] = f[i];}}int maxn = 1;for (int i = 0; i < n; i ++)if (f[i] > maxn)maxn = f[i];cout << maxn << endl; } ?

轉載于:https://www.cnblogs.com/AbandonZHANG/archive/2013/01/21/4114202.html

總結

以上是生活随笔為你收集整理的Codeforces 264B Good Sequences ★ (分解素因子+DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。