【CF772D】Varying Kibibits

题意:定义函数f(a,b,c...)表示将a,b,c..的10进制下的每一位拆开,分别取最小值组成的数。如f(123,321)=121,f(530, 932, 81)=30。给你一个数集$T={a_1,a_2...a_n}$,定义函数G(x)

求$G(1)\oplus G(2)\oplus ...G(999999)$。

$1\le n \le 1000000,0\le a_i \le 999999$

题解:发现f函数就是10进制下的按位与,所以我们先对原序列进行fwt。具体地说,因为上面那个式子里有平方,所以我们要维护3个东西,a[i]表示T中i的个数,b[i]=a[i]*i,c[i]=a[i]*i*i。将这三个东西都进行fwt。

怎么统计呢?我们要求的就是一个集合的所有子集的元素的完全平方和。设当前的集合为U,我们考虑其中一个元素y的贡献,如果$S\subseteq U-y$,那么y会在$S+y$和$U-S$里分别被统计,也就是说其贡献是$y\times 2^{|U|-2}(b[U]+y)$。所以总的贡献就是$2^{|U|-2}(b[U]^2+c[U])$。特判:当a[U]=1时,贡献就是c[U];当a[U]=0时,贡献=0。

再逆fwt回去就好了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. const int maxn=1000010;
  6. typedef long long ll;
  7. const ll P=1000000007;
  8. int n,len;
  9. ll ans;
  10. ll a[maxn],b[maxn],c[maxn],f[maxn],bt[maxn];
  11. inline int rd()
  12. {
  13. int ret=0,f=1; char gc=getchar();
  14. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  15. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  16. return ret*f;
  17. }
  18. inline void fwt()
  19. {
  20. int h,i;
  21. for(h=1;h<len;h*=10)
  22. {
  23. for(i=len-1;~i;i--) if(i/h%10)
  24. {
  25. a[i-h]=(a[i-h]+a[i])%P;
  26. b[i-h]=(b[i-h]+b[i])%P;
  27. c[i-h]=(c[i-h]+c[i])%P;
  28. }
  29. }
  30. }
  31. inline void ufwt()
  32. {
  33. int h,i;
  34. for(h=1;h<len;h*=10)
  35. {
  36. for(i=0;i<len;i++) if(i/h%10)
  37. {
  38. f[i-h]=(f[i-h]-f[i]+P)%P;
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. n=rd();
  45. int i;
  46. ll x;
  47. for(i=1;i<=n;i++) x=rd(),a[x]++,b[x]=(b[x]+x)%P,c[x]=(c[x]+x*x)%P;
  48. len=1000000;
  49. fwt();
  50. for(bt[0]=i=1;i<=n;i++) bt[i]=(bt[i-1]<<1)%P;
  51. for(i=0;i<len;i++)
  52. {
  53. if(!a[i]) continue;
  54. if(a[i]==1) f[i]=c[i];
  55. else f[i]=bt[a[i]-2]*(b[i]*b[i]%P+c[i])%P;
  56. }
  57. ufwt();
  58. for(i=0;i<len;i++) ans^=f[i]*i;
  59. printf("%lld",ans);
  60. return 0;
  61. }

【CF772D】Varying Kibibits FWT的更多相关文章

  1. 【CSU1911】Card Game(FWT)

    [CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...

  2. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

  3. 【CF850E】Random Elections FWT

    [CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...

  4. 【XSY2753】Lcm 分治 FWT FFT 容斥

    题目描述 给你\(n,k\),要你选一些互不相同的正整数,满足这些数的\(lcm\)为\(n\),且这些数的和为\(k\)的倍数. 求选择的方案数.对\(232792561\)取模. \(n\leq ...

  5. 【bzoj4589】Hard Nim FWT+快速幂

    题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...

  6. 【learning】快速沃尔什变换FWT

    问题描述 已知\(A(x)\)和\(B(x)\),\(C[i]=\sum\limits_{j\otimes k=i}A[j]*B[k]\),求\(C\) 其中\(\otimes\)是三种位运算的其中一 ...

  7. 【bzoj4589】Hard Nim FWT

    题目描述 Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下: 1. Claris和NanoApe两个人轮流拿石子,Claris先拿. 2. 每次只能从一堆中取若干个,可将一堆全取走, ...

  8. 洛谷P4717 【模板】快速沃尔什变换(FWT)

    题意 题目链接 Sol 背板子背板子 #include<bits/stdc++.h> using namespace std; const int MAXN = (1 << 1 ...

  9. 【BZOJ4911】[SDOI2017]切树游戏(动态dp,FWT)

    [BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子 ...

随机推荐

  1. Can't clobber writable file **************

    最近搭建了新的quick check server, workspace也是新的.但是get latest (unshelve)的时候,出现以下错误: can't clobber writable f ...

  2. 【MySQL】[Err] [Imp] 2006 - MySQL server has gone away .

    wait_timeout= interactive_timeout = max_allowed_packet=10M my.ini 后面增加 就可以解决

  3. phpcms v9模板制作教程(转载)

    第一节 1.首先下载phpcms v9的集成安装包并安装,这里就不详细说明了. 2.本地调试建议大家使用APMserver,或者wampserver等,可以到PHPCMS吧官方网站首页链接下载.安装好 ...

  4. CentOS 7 mini安装后安装图形界面及远程设置

    安装图形界面 yum group install "GNOME Desktop" "Graphical Administration Tools" 安装 xrd ...

  5. ios开发之--MJRefresh的简单使用

    MJRefresh是MJ大神写的框架,很强大,好多外国开发者都在用! 具体方法如下: -(void)requestData { NSString *userIdStr = [NSString stri ...

  6. Docker应用之仓库

    仓库是存放镜像的地方 注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库也可以有多个镜像 如 dl.dockerpool.com/ubuntu ,dl.dockerpool.com ...

  7. Python "HTTP Error 403: Forbidden"

    问题: 执行下面的语句时 def set_IPlsit(): url = 'https://www.whatismyip.com/' response = urllib.request.urlopen ...

  8. ASP正则匹配方法

    方法二:找到匹配的进行替换 ip="127.0.0.1" Function ReplaceTest(str,patrn, replStr) Dim regEx, str1 Set ...

  9. Maven构建Web项目

    1. Maven的作用: [清理项目]→[编译项目]→[测试项目]→[生成测试报告]→[打包项目]→[部署项目] 2. 安装maven maven对JDK版本有要求,所以要设置好JDK的环境变量. M ...

  10. C语言中一个字符数组里面的所有元素变成一个字符串

    #include <string.h> int main() // 这里为了方便直接用main函数 {     char array[] = { 'h', 'e', 'l', 'l', ' ...