hdu 5072 Coprime 約數,容斥原理

2021-07-05 10:35:49 字數 1387 閱讀 8853

給出一些數,挑選其中3個,求兩兩互質和兩兩不互質的方案數。

需要對唯一分解原理有一定的理解,兩個數不互質無非就是質因數分解後有相同的部分,比如a質因數分解為p1*p2*p3*p4...(指數省略),與a不互質的數有p1的倍數,p2的倍數...,根據容斥原理還需減去p1*p2的倍數,總結就是奇數個加,偶數個減。

本題求得兩兩互質和兩兩不互質的反面是,兩對互質一對不互質和兩隊不互質一對互質,求出與每個數互質與不互質的個數,相乘,最後除2即可。

#include#include#include#include#include#include#include#include#include#include#define fi first

#define se second

#define pii pair#define ll long long

#define inf 1<<30

#define eps 1e-8

using namespace std;

const int maxn=100005;

int n;

int d[maxn];

int num[maxn];

bool vis[maxn];

int prime[maxn];

int sum[maxn];

int cnt;

int p[maxn];

int now;

void getprime()

}cnt=0;

for(int i=2;i<=n;i++)

}ll ans;

void dfs(int k,int tot)

dfs(k+1,tot);

dfs(k+1,tot*p[k]);

}void gao(int a)

if(a>1)

p[now++]=a;

dfs(0,1);

}ll uu;

void dfs(int k,int tot,int o)

return;

}dfs(k+1,tot,o);

dfs(k+1,tot*p[k],o+1);

}ll l(int a)

if(a>1)

p[now++]=a;

uu=0;

dfs(0,1,0);

return uu;

}int main()

{ getprime();

int t;

int a;

scanf("%d",&t);

while(t--) {

memset(sum,0,sizeof(sum));

memset(num,0,sizeof(num));

scanf("%d",&n);

for(int i=0;i

HDU 5072 Coprime 同色三角形問題

好吧,我承認就算當時再給我五個小時我也做不出來。首先解釋同色三角形問題 給出n n 3 個點,這些點中的一些被塗上了紅色,剩下的被塗上了黑色。然後將這些點兩兩相連,於是每三個點都會組成乙個三角形,即總共有sum c 3,n 個三角形。對於乙個三角形,如果三個點顏色一樣則稱其為同色三角形。那麼乙個很直...

容斥原理 HDU 5072

解題思路 如果三個數a,b,c不符合條件,那麼一定有一對是互質的,有一對是不互質的。不妨令a,b互質,b,c不互質。於是我們可以列舉b來統計答案。在除了b自己的所有數中,要麼與b互質,要麼與b不互質。假設n個數中有x個與b不互質的數,那麼b對答案的貢獻就是 x 1 n x 注意這裡的求出答案之後要除...

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個點,兩兩連邊,有紅邊和藍邊,問三邊同色三角形有多少。然後考慮算反面,發現只要找從乙個點出發的兩種邊分別有幾條...