zoukankan      html  css  js  c++  java
  • luoguP6570 [NOI Online #3 提高组]优秀子序列 dp

    由于集合内的数不能有交集,所以显然是子集 dp 的形式.  

    但是这道题为了不算重不太能用 FWT 优化,直接暴力 dp 的话是 $O(3^{18})$ 的,洛谷上开 O2 能过. 

    code: 

    #include <bits/stdc++.h>   
    #define N 1000007 
    #define ll long long 
    #define mod 1000000007 
    #define setIO(s) freopen(s".in","r",stdin)  
    using namespace std; 
    int n,cnt; 
    int a[N],f[N];  
    int phi[N],prime[N],vis[N],many[N];       
    void init() 
    {
        phi[1]=1; 
        for(int i=2;i<N;++i) 
        {
            if(!vis[i]) prime[++cnt]=i,phi[i]=i-1;    
            for(int j=1;j<=cnt&&prime[j]*i<N;++j) 
            {
                vis[i*prime[j]]=1;   
                if(i%prime[j]!=0) phi[i*prime[j]]=phi[i]*(prime[j]-1);   
                else 
                {   
                    phi[i*prime[j]]=phi[i]*prime[j];     
                    break; 
                }
            }
        }
    }    
    int qpow(int x,int y) 
    {
        int tmp=1; 
        for(;y;y>>=1,x=(ll)x*x%mod) 
            if(y&1) tmp=(ll)tmp*x%mod; 
        return tmp; 
    } 
    int main() 
    { 
        // setIO("input");  
        scanf("%d",&n);    
        int mx=0;        
        for(int i=1;i<=n;++i) 
        {
            scanf("%d",&a[i]),f[a[i]]++,many[a[i]]++;    
            mx=max(mx,a[i]);   
        }
        mx<<=1;             
        init();               
        for(int i=1;i<=mx;++i)        
        {
            int c=(i%2==0)?i/2:i/2+1;       
            for(int j=i&(i-1);j>=c&&j;j=i&(j-1)) 
            {    
                f[i]+=(ll)many[j]*f[i^j]%mod;        
                f[i]>=mod?f[i]-=mod:0;    
            }         
        }   
        for(int i=1;i<=mx;++i)          
            f[i]=(ll)f[i]*qpow(2,f[0])%mod;   
        f[0]=qpow(2,f[0]);    
        int ans=0; 
        for(int i=0;i<=mx;++i)
            if(f[i]) ans+=(ll)phi[i+1]*f[i]%mod,ans>=mod?ans-=mod:0;     
        printf("%d
    ",ans);  
        return 0; 
    }
    

      

  • 相关阅读:
    07-2. A+B和C (15)
    07-1. 换个格式输出整数 (15)
    07-0. 写出这个数 (20)
    06-3. 单词长度(15)
    06-2. 字符串字母大小写转换(10)
    06-1. 简单计算器(20)
    06-0. 混合类型数据格式化输入(5)
    05-3. 求a的连续和(15)
    05-2. 念数字(15)
    05-1. 约分最简分式(15)
  • 原文地址:https://www.cnblogs.com/guangheli/p/13083010.html
Copyright © 2011-2022 走看看