您的位置:首页 > 其它

ACdream 1071

2016-05-28 20:41 211 查看
Description在计算机的世界里,%不是百分比,而是除法取余哟!比如:  4 % 2 = 0  5 % 3 = 2给你 2 ≤ N ≤ 100000 个数,a[1],a[2]...a[i]...a(1 ≤ a[i] ≤ 100000)。问有几个组合 (a[i], a[j]),(i != j, a[i] > a[j]),使得 a[i] % a[j] != 0。Input输入有多组数据。(<= 30)对于每组数据:第一行:N(表示 N 个数)第二行:N 个元素 a[i]  Output输出有几个组合 (a[i],a[j]),使得 a[i] % a[j] != 0Sample Input
3
1 1 1
4
1 2 3 4
5
1 2 2 4 6
这道题比赛时蒙蔽了,也不知道是比赛时太烦躁了还是真的太笨了,看到复杂度那么大还一根经的去排序,筛选法和
打表法明明都会却不知道用,倍数明明比排序不知道要快多少倍啊,明天一定要冷静冷静,诶反正已经在淘汰的边缘了只管放开去想了
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100011;int a, b;int main(){    int n;    while(cin>>n)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        int j=0;        int Max=-1;        for(int i=0;i<n;i++)        {            int x;            cin>>x;            if(a[x]==0)            {                b[j++]=x;            }            a[x]++;            Max=max(Max,x);        }        sort(b,b+j);        long long ans=0, s=0, sum=0;        for(int i=0;i<j;i++)        {            int y=b[i];            ans+=s*a[y];            s+=a[y];            for(int k=2*y;k<=Max;k+=y)            {                sum+=a[y]*a[k];            }        }        cout<<ans-sum<<endl;    }    return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: