zoukankan      html  css  js  c++  java
  • 2844: albus就是要第一个出场

    2844: albus就是要第一个出场

    链接

    分析:

      和HDU3949差不多互逆,这里需要加上相同的数。

      结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大小。

      结论:集合中所有异或值为0的集合有$2^{n-cnt}$个(包括空集)。

      证明及详细过程参考:https://blog.sengxian.com/algorithms/linear-basishttps://blog.csdn.net/jaihk662/article/details/78654679

     

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 
     5 char buf[100000],*_p1 = buf,*_p2 = buf;
     6 #define nc() (_p1==_p2&&(_p2=(_p1=buf)+fread(buf,1,100000,stdin),_p1==_p2) ? EOF : *_p1++)
     7 inline int read() {
     8     int x=0,f=1;char ch=nc();for(;!isdigit(ch);ch=nc())if(ch=='-')f=-1;
     9     for (;isdigit(ch);ch=nc())x=x*10+ch-'0';return x*f;
    10 }
    11 
    12 const int N = 100010;
    13 const int m = 30;
    14 const int mod = 10086;
    15 
    16 int a[N],b[100];
    17 vector<int> v;
    18 int n,cnt;
    19 
    20 inline void build() {
    21     for (int i=1; i<=n; ++i) 
    22         for (int j=m; j>=0; --j) 
    23             if ((a[i] >> j) & 1) {
    24                 if (b[j]) a[i] ^= b[j];
    25                 else {
    26                     cnt++;b[j] = a[i];
    27                     for (int k=j-1; k>=0; --k) if (b[k]&&((b[j]>>k)&1)) b[j] ^= b[k]; // 这两行可以省掉,因为下面用不到,只判断一下 
    28                     for (int k=j+1; k<=m; ++k) if ((b[j]>>k)&1) b[k] ^= b[j];
    29                     break;
    30                 }
    31             }
    32     for (int i=0; i<=m; ++i) 
    33         if (b[i]) v.push_back(i); // --push_back(i),说明(1<<i)的位置有1 
    34 }
    35 inline int ksm(int a,int b) {
    36     int ans = 1; // --
    37     while (b) {
    38         if (b & 1) ans = (ans * a) % mod;
    39         a = (a * a) % mod;
    40         b >>= 1;
    41     }
    42     return ans % mod;
    43 }
    44 inline void solve() {
    45     int q = read();
    46     if (q == 0) {cout << 1;return ;}
    47     int rnk = 0,sz = v.size();
    48     for (int i=0; i<sz; ++i) // 得到排名,从小的开始取,看v[i]能否才参与构成q,如果可以加上2^i,i为v[i]的排名(第i个线性基元素) 
    49         if ((q >> v[i]) & 1) rnk += (1 << i); 
    50     cout << (rnk % mod * ksm(2,n-cnt) + 1) % mod; // 加一:包括空集 
    51 }
    52 int main() {
    53     n = read();
    54     for (int i=1; i<=n; ++i) a[i] = read();
    55     build();
    56     solve();
    57     return 0;
    58 }
  • 相关阅读:
    基于mini2440的两种触屏中断程序(T35)
    TFT LCD控制显示总结(硬件概念、初始化相关配置)
    TFT资料大全
    最全的摄像头资料
    【转】x.509证书在WCF中的应用(CS篇)
    C#中可以使用正则表达式来过滤html字符
    前台调用后台方法(转来的!)
    C#字符串截取(区分汉字)(转)
    用C#制作PDF文件全攻略 (专至csdn)
    证书创建工具 (Makecert.exe)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/9262133.html
Copyright © 2011-2022 走看看