• bzoj3811 uoj36 玛里苟斯


    做题前问了一下miaom,得到了一个奇怪的回答

    mmp

    这题分类讨论

    k=1sb题

    k=2按位计算,把每个数看成几个2的幂次的和,按位跑期望

    k>2线性基sb题

    没了

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define N 100005
     6 #define M 75
     7 #define ll unsigned long long
     8 using namespace std;
     9 
    10 int n,flag; ll ans,res,mod,bin[M],a[N],base[M]; bool f[M][M];
    11 void calc(){
    12     int i,j;
    13     for (i=1; i<=n; i++)
    14         for (j=31; j>=0; j--) if (a[i]&bin[j])
    15             if (!base[j]){
    16                 base[j]=a[i]; break;
    17             } else a[i]^=base[j];
    18     for (j=n=0; j<32; j++) if (base[j]) a[++n]=base[j];
    19 }
    20 void solve1(){
    21     int i,j,k,t;
    22     for (i=0; i<32; i++)
    23         for (j=1; j<=n; j++) f[i][j]=(a[j]&bin[i])?1:0;
    24     for (i=0; i<32; i++)
    25         for (j=0; j<32; j++){
    26             for (k=1; k<=n; k++) if (f[i][k]) break;
    27             if (k>n) continue;
    28             for (k=1; k<=n; k++) if (f[j][k]) break;
    29             if (k>n) continue;
    30             t=0;
    31             for (k=1; k<=n && !t; k++)
    32                 if (f[i][k]!=f[j][k]) t=1;
    33             if (i+j-1-t<0) res++; else ans+=bin[i+j-1-t];
    34             ans+=res>>1; res&=1;
    35         }
    36     printf("%llu",ans); puts(res?".5":"");
    37 }
    38 void dfs(int k,ll now){
    39     if (k>n){
    40         int i; ll u=0,v=1;
    41         for (i=1; i<=flag; i++){
    42             u*=now; v*=now;
    43             u+=v>>n; v&=mod;
    44         }
    45         ans+=u; res+=v;
    46         ans+=res>>n; res&=mod;
    47         return;
    48     }
    49     dfs(k+1,now); dfs(k+1,now^a[k]);
    50 }
    51 void solve2(){
    52     mod=bin[n]-1; dfs(1,0);
    53     printf("%llu",ans); puts(res?".5":"");
    54 }
    55 int main(){
    56     scanf("%d%d",&n,&flag); int i;
    57     bin[0]=1; for (i=1; i<63; i++) bin[i]=bin[i-1]<<1;
    58     for (i=1; i<=n; i++) scanf("%llu",&a[i]);
    59     if (flag==1){
    60         for (i=1; i<=n; i++) ans|=a[i];
    61         printf("%llu",ans>>1); puts((ans&1)?".5":"");
    62         return 0;
    63     }
    64     calc();
    65     if (flag==2) solve1(); else solve2();
    66     return 0;
    67 }
  • 相关阅读:
    文件上传跨域解决方案-jQuery-File-Upload
    求数列的的增幅,已知起始列和结束列,中间阶梯数
    mud那些坑 find_object问题
    jquery mCustomScrollbar使用
    JS的Date对象
    JS获取当前日期
    Go数组求和
    Go九九乘法表
    Go语言基础之time包
    Go语言基础之流程控制
  • 原文地址:https://www.cnblogs.com/wanglichao/p/7262199.html
Copyright © 2020-2023  润新知