csu 1756(数论+去重)
生活随笔
收集整理的這篇文章主要介紹了
csu 1756(数论+去重)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Prime
Time Limit: 3 Sec??Memory Limit: 128 MB
Submit: 84??Solved: 12
[Submit][Status][Web Board]
Description
如果a,b的最大公約數是1,說明a,b是一對互素的數,給定你n個數字,希望你找出互素的數的對數
Input
第一行輸入一個正整數T,表示數據組數
每組數據第一行輸入一個正整數n,表示數字的個數(n<=10000)
接下來一行輸入n個正整數,每個數字大小不超過1000。
Output
輸出互素的數的對數
Sample Input
1 4 10 9 6 35Sample Output
3數字有10000個,暴力肯定要炸,但是數字范圍只有 1000 ,那么我們可以去重后計數利用乘法原理再算。這樣暴力的話就只有10^6了,1要特判(2016湘潭賽有個題很像) #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; }
?
轉載于:https://www.cnblogs.com/liyinggang/p/5766772.html
總結
以上是生活随笔為你收集整理的csu 1756(数论+去重)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能测试工具整理
- 下一篇: 2016第三本《曾国藩的正面和侧面》