zoukankan      html  css  js  c++  java
  • SPOJ 4191. Sky Code 夜

    http://www.spoj.com/problems/MSKYCODE/

    容斥原理

    在我不断的优化过后,终于过了

    代码:

    #include <iostream>
    #include <cstdio>
    #include <map>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <vector>
    
    #define ll long long
    
    using namespace std;
    
    const int N=10005;
    const long long LINF=(long long)(1e18);
    int a1[N],a2[N],r1[N],r2[N];
    int p[N];
    int b[N];
    int num[N],k[N];
    ll c[N][5];
    bool prime[N];
    int main()
    {
        //freopen("data.in","r",stdin);
        for(int i=0;i<N;++i)
        for(int j=0;j<=i&&j<=4;++j)
        if(i==j||j==0) c[i][j]=1;
        else c[i][j]=c[i-1][j-1]+c[i-1][j];
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            int M=0;
            memset(num,0,sizeof(num));
            for(int i=0;i<n;++i)
            {
                scanf("%d",&b[i]);
                ++num[b[i]];
                M=max(M,b[i]);
            }
            memset(k,0,sizeof(k));
            for(int i=2;i<=M;++i)
            for(int j=i;j<=M;j=j+i)
            k[i]+=num[j];
            int pn=0;
            memset(prime,true,sizeof(prime));
            for(int i=2;i<=M;++i)
            if(prime[i])
            {
                p[pn++]=i;
                for(int j=i+i;j<=M;j=j+i)
                prime[j]=false;
            }
            ll sum=c[n][4];
            for(int i=0;i<pn;++i)
            {
                a1[i]=p[i];
                r1[i]=i;
            }
            int len=pn;
            int f=1;
            while(len>0)
            {
                f=-f;
                int m=0;
                for(int i=0;i<len;++i)
                {
                    if(k[a1[i]]>=4)
                    {
                        r2[m]=r1[i];
                        a2[m++]=a1[i];
                        sum+=(f*c[k[a1[i]]][4]);
                    }
                }
                len=0;
                for(int i=0;i<m;++i)
                {
                    for(int j=r2[i]+1;j<pn;++j)
                    {
                        if(a2[i]%p[j]&&a2[i]*p[j]<=M)
                        {
                            r1[len]=j;
                            a1[len++]=a2[i]*p[j];
                        }
                    }
                }
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    maven+spark2.0.0最大连通分量
    Eclipse+maven+scala2.11.8+spark2.0.0的环境部署
    杀死mapreduce
    filter-自己的理解
    JS变量声明提升
    js==运算符强制转换规则
    html 文字间距
    如你所见,我开始用微博
    vue数据模拟
    vue项目目录介绍
  • 原文地址:https://www.cnblogs.com/liulangye/p/3114308.html
Copyright © 2011-2022 走看看