poj 3904 求四元互質集合

2021-10-06 10:47:01 字數 938 閱讀 5030

從給定的集合中求互質四元組的個數。

解題思路:先求解非互質四元組的個數,在總體四元組個數減去這個數目。求非互質四元組即求公因數大於1的四元組數目,因此,使用公因數d把集合中的元素劃分成不同的子集,每個子集中的四元組一定是非互質的。還有一點需要考慮的是,不同子集中可能蘊含相同的非互質四元組。可以使用容斥原理解決這個問題,具體的方法是對公因數d進行質因數分解,若d可以分解成奇數個質數,就在非互質四元組總數中加上公因數d對應的非互質四元組,若為偶數則減去。

#include

#include

#include

using namespace std;

int cnt[

10010];

//記錄每個因數對應子集的元素數

int num[

10010];

//記錄每個因數分解的不同質因數個數

int prime[5]

;//記錄乙個數字對應的質因數(10000以內最多有五個不同質因數)

long long p[

10010]=

;//記錄組合數

void

solve

(int n)

if(n!=1)

//對應輸入的數字本身就是質數

prime[tol++

]=n;

for(int i=

1;i<(1

<;i++

)//質因數的組合方法有2的tol次冪個

} cnt[k]++;

num[k]

=sum;}}

int main()

long long ans=0;

for(i=

0;i<

10010

;i++)}

cout<-ans<}return0;

}

引自:

poj3904 容斥原理)

可以得到這樣的關係 奇數加 偶數減 題目大意 給一串數字,求解互質四元組的個數 注意不必兩兩互質 解題思路 網上有很多 但是詳細講解的很少,這裡結合筆者的思路詳細論述一下解題思路,耐心一看。首先容易想到,想計算不互質的四元組的個數,再用總的減去,關鍵是怎樣計數不互質四元組的個數?列舉公約數,對於同乙...

poj 3904 容斥原理 質因數分解

題意 給你一串數字,問選擇4個數且這四個數的最大公因數為1的選法為多少種 解法 很容易想到容斥原理,答案為選擇四個數的所有種數 四個數存在最大公因數為質數 四個數存在最大公因數為兩個質數之積 四個數存在最大公因數為三個質數之積。就是處理各個由質因子相乘得到的因子的數量比較麻煩。首先,題目給的資料範圍...

POJ 3904 Sky Code 容斥原理

題意 選出最大公約數為1的四元組的方案 思路 容斥原理 總的方案c n,4 減去t 1 t 2 t 3 kt k t i 表示四元組質因子的個數為i的方案數 include include include using namespace std const int maxn 10010 typede...