csu 1756(数论+去重)
生活随笔
收集整理的這篇文章主要介紹了
csu 1756(数论+去重)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Prime
Time Limit: 3 Sec??Memory Limit: 128 MB
Submit: 84??Solved: 12
[Submit][Status][Web Board]
Description
如果a,b的最大公約數(shù)是1,說(shuō)明a,b是一對(duì)互素的數(shù),給定你n個(gè)數(shù)字,希望你找出互素的數(shù)的對(duì)數(shù)
Input
第一行輸入一個(gè)正整數(shù)T,表示數(shù)據(jù)組數(shù)
每組數(shù)據(jù)第一行輸入一個(gè)正整數(shù)n,表示數(shù)字的個(gè)數(shù)(n<=10000)
接下來(lái)一行輸入n個(gè)正整數(shù),每個(gè)數(shù)字大小不超過(guò)1000。
Output
輸出互素的數(shù)的對(duì)數(shù)
Sample Input
1 4 10 9 6 35Sample Output
3數(shù)字有10000個(gè),暴力肯定要炸,但是數(shù)字范圍只有 1000 ,那么我們可以去重后計(jì)數(shù)利用乘法原理再算。這樣暴力的話就只有10^6了,1要特判(2016湘潭賽有個(gè)題很像) #include <iostream> #include <cstring> #include <stdio.h> #include <stdlib.h> #include <algorithm> using namespace std; int num[1005]; int gcd(int a,int b){return b==0?a:gcd(b,a%b); } int main() {int tcase,n;int a[10005];scanf("%d",&tcase);while(tcase--){memset(num,0,sizeof(num));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+1+n);num[a[1]]++;int k=1;for(int i=2;i<=n;i++){if(a[i]==a[i-1]){num[a[i]]++;continue;}a[++k] = a[i];num[a[i]]++;}long long ans=0;for(int i=1;i<=k;i++){for(int j=1;j<=i;j++){if(gcd(a[i],a[j])==1&&a[i]!=a[j]){ans+=(long long)num[a[i]]*num[a[j]];}else if(a[i]==1&&num[a[i]]>1){ans+=num[a[i]]*(num[a[i]]-1)/2;}}}printf("%lld\n",ans);}return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/liyinggang/p/5766772.html
總結(jié)
以上是生活随笔為你收集整理的csu 1756(数论+去重)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 性能测试工具整理
- 下一篇: 2016第三本《曾国藩的正面和侧面》