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