容斥原理 HDU 5072

2021-08-07 16:41:20 字數 1542 閱讀 5380

解題思路:「如果三個數a, b, c不符合條件,那麼一定有一對是互質的,有一對是不互質的。不妨令a, b互質,b, c不互質。於是我們可以列舉b來統計答案。在除了b自己的所有數中,要麼與b互質,要麼與b不互質。假設n個數中有x個與b不互質的數,那麼b對答案的貢獻就是(x - 1) * (n - x)。注意這裡的求出答案之後要除以2,這是因為如果a, c互質,那麼可以交換b, c的位置;如果a, c不互質,那麼可以交換a, b的位置,每個答案都被計算了兩遍。」

這道題是要求互不相同的n個數中有多少abc這樣的組合,滿足abc兩兩互質或者兩兩不互質。三元關係很傷腦筋,轉化為二元關係也許能簡化問題(這裡腦洞要慢慢開啟了)。

由於資料範圍不大10^5以內,總組合數c(n,3) longlong不會爆。abc兩兩互質和兩兩不互質,就對應著兩個互質另兩個不互質,這兩個集合構成了全集u。不妨把前者稱為集合a,後者稱為集合b,那麼a並b等於u,且a交b為空。u的大小為c(n,3)。

如果a,b,c不符合條件,必然有一對互質,一對不互質,不妨設a,b互質,b,c不互質,於是我們可以列舉b來統計所有的三元組:如果a,c互質那麼這樣的三元組中b,c可以互換位置;如果a,c不互質,那麼a,b可以互換位置。每個答案被算了兩遍。

所以只要列舉每個b,統計出k個和它不互質的,那麼剩下n-1-k個就是和它互質的,那麼三元組就有k*(n-1-k)/2種。

如果會快速統計1~n個數中有多少和b不互質的數,那麼題目就差不多就做完了…

對於b不超過10^5,質因子的個數不超過6個(2*3*5*7*11*13 *17>10^5)。找出每個因子的數目。利用容斥原理統計出與b不互質的數的綜述。

#include

#define ll long long

using

namespace

std;

const

int maxn=100010;

int a[maxn],num[maxn],f[maxn][30],nn[maxn];

int isprime[maxn],prime[10000],cnt=0;

int vis[maxn];

void inti()//指數打表

}}//很關鍵的地方

void fen()//用這種方法求因子不會超時,乙個乙個分解因子會超時,時間是n根號(n)

}}void fenyin(int n,int k)//分解質因子

}if(m>1)

f[k][c++]=m;

nn[k]=c;

}ll rongchi(int k)//容斥

return sum;

}int main()

fen();

long

long ans=0;

for(int i=0;i1);

//cout<}

ans/=2;

long

long ans1=1;

for(int i=1;i<=3;i++)

ans1=ans1*(n-i+1)/i;

printf("%i64d\n",ans1-ans);

}}

hdu 5072 Coprime 約數,容斥原理

給出一些數,挑選其中3個,求兩兩互質和兩兩不互質的方案數。需要對唯一分解原理有一定的理解,兩個數不互質無非就是質因數分解後有相同的部分,比如a質因數分解為p1 p2 p3 p4.指數省略 與a不互質的數有p1的倍數,p2的倍數.根據容斥原理還需減去p1 p2的倍數,總結就是奇數個加,偶數個減。本題求...

hdu5072 莫比烏斯

給出n個數,問其中有多少三元組 a,b,c 使得 a,b b,c a,c 1 or a,b 1 and a,c 1 and b,c 1 n 10 5,ai 10 5.首先可以把問題抽象為有n個點,兩兩連邊,有紅邊和藍邊,問三邊同色三角形有多少。然後考慮算反面,發現只要找從乙個點出發的兩種邊分別有幾條...

hdu 4336 容斥原理

按照解題報告的提示,用容斥原理實現 for int j bg 1 j另解 概率dp,康哥指導的 include include includeusing namespace std double f 1 21 gl 22 int main int i,j,k,n double fz,fm while...