概述
问题描述:
描述
Given many integers, find out the number of triples (a, b, c) which satisfy a, b, c are co-primed each other or are not co-primed each other. In a triple, (a, b, c) and (b, a, c) are considered as same triple.
输入
The first line contains a single integer T (T <= 15), indicating the number of test cases.In each case, the first line contains one integer n (3 <= n <= 1000), second line contains n integers d (1 <= d < 105) separated with space.
输出
For each test case, output an integer in one line, indicating the number of triples.
样例输入
1
6
2 3 5 7 11 13
样例输出
20
思路. 本题意在找出所有的三元组,满足:
1 三个数都互质
2 三个数都不互质
换一种思路:
当三元组中存在一个或两个数对不互质时,不满足条件 .
假设a 为与元素i互质的元素个数,b为与元素i不互质的元素个数, 那么包含元素i 的,不满足条件的三元组共a*b个 。
- 需通过观察可知, 当一次求完a*b累加后,正好多算了一倍。 也就是结果应为 : 总情况数 - sum(a*b)/2;
代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <utility>
#include <cstring>
using namespace std;
int gcd (int v1,int v2)
{
while(v2){
int tmp = v2;
v2 = v1 % v2;
v1 = tmp;
}
return v1;
}
int main(int argc, char* argv[])
{
int t;
cin >> t;
while(t--)
{
vector<int> num;
int n;
cin >> n;
for(int i=0;i<n;i++)
{
int tmp;
scanf("%d",&tmp);
num.push_back(tmp);
}
int cgcd=0,cngcd=0,total=(n*(n-1)*(n-2)/6),ans=0;;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(i!=j){
if(gcd(num[i],num[j])==1)
cgcd++;
else
cngcd++;}
ans+=cgcd*cngcd;
cgcd=0;cngcd=0;
}
cout<< total-ans/2<<endl;
}
}
最后
以上就是冷静流沙为你收集整理的(数学题) Counting的全部内容,希望文章能够帮你解决(数学题) Counting所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复