Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
文章目錄
- 目錄
- 題意:
- 思路:
目錄
題意:
給你一個長度為nnn的數組,你每次可以選擇其中的兩個數,如果他們的gcdgcdgcd在數組中沒有出現那么就可以加在數組后面構成一個新的數組,問數組最長是多少。
2≤n≤1e6,1≤ai≤1e62\le n\le 1e6,1\le a_i\le 1e62≤n≤1e6,1≤ai?≤1e6
思路:
設cnt[i]cnt[i]cnt[i]表示包含因子iii的數有多少個,但是想要判斷兩個數的gcd==igcd==igcd==i只靠cnt[i]>1cnt[i]>1cnt[i]>1是不夠的,因為不能保證其中兩個數的最大公因數是iii,但是我我們如果枚舉包含以iii為因子的數jjj,如果存在cnt[i]==cnt[j]cnt[i]==cnt[j]cnt[i]==cnt[j],那么一定不存在兩個數的最大公因數是iii,因為這個時候這些數最大公因數是jjj。當不存在上述情況且有兩個x,yx,yx,y滿足cnt[x]>0,cnt[y]>0cnt[x]>0,cnt[y]>0cnt[x]>0,cnt[y]>0,那么此時這兩個集合中的數最大公因數一定是iii,直接nlognnlognnlogn求即可。
#include<bits/stdc++.h> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define Mid (tr[u].l+tr[u].r>>1) #define pb push_back using namespace std;const int N=1000260,INF=0x3f3f3f3f,mod=1e9+7; typedef long long LL; typedef pair<int,int> PII;int n; int a[N],mp[N],cnt[N]; int gc[N];void solve() {scanf("%d",&n);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);mp[a[i]]=1; cnt[a[i]]=1;}int ans=0;for(int i=1;i<=1e6;i++) {for(int j=i+i;j<=1e6;j+=i) {cnt[i]+=cnt[j];}}for(int i=1;i<=1e6;i++) {int flag=cnt[i]>0;for(int j=i+i;j<=1e6;j+=i) {if(cnt[i]==cnt[j]) flag=0;}ans+=flag;}printf("%d\n",ans-n); }int main() {int _=1;while(_--) {solve();}return 0; }總結
以上是生活随笔為你收集整理的Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么做才能获得加分电脑如何加分
- 下一篇: P3067 [USACO12OPEN]B