從給定的集合中求互質四元組的個數。
解題思路:先求解非互質四元組的個數,在總體四元組個數減去這個數目。求非互質四元組即求公因數大於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...