【CF772D】Varying Kibibits FWT

【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回去就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1000010;
typedef long long ll;
const ll P=1000000007;
int n,len;
ll ans;
ll a[maxn],b[maxn],c[maxn],f[maxn],bt[maxn];
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
inline void fwt()
{
	int h,i;
	for(h=1;h<len;h*=10)
	{
		for(i=len-1;~i;i--)	if(i/h%10)
		{
			a[i-h]=(a[i-h]+a[i])%P;
			b[i-h]=(b[i-h]+b[i])%P;
			c[i-h]=(c[i-h]+c[i])%P;
		}
	}
}
inline void ufwt()
{
	int h,i;
	for(h=1;h<len;h*=10)
	{
		for(i=0;i<len;i++)	if(i/h%10)
		{
			f[i-h]=(f[i-h]-f[i]+P)%P;
		}
	}
}
int main()
{
	n=rd();
	int i;
	ll x;
	for(i=1;i<=n;i++)	x=rd(),a[x]++,b[x]=(b[x]+x)%P,c[x]=(c[x]+x*x)%P;
	len=1000000;
	fwt();
	for(bt[0]=i=1;i<=n;i++)	bt[i]=(bt[i-1]<<1)%P;
	for(i=0;i<len;i++)
	{
		if(!a[i])	continue;
		if(a[i]==1)	f[i]=c[i];
		else	f[i]=bt[a[i]-2]*(b[i]*b[i]%P+c[i])%P;
	}
	ufwt();
	for(i=0;i<len;i++)	ans^=f[i]*i;
	printf("%lld",ans);
	return 0;
}

原文地址:https://www.cnblogs.com/CQzhangyu/p/8445231.html

时间: 2024-10-11 09:47:53

【CF772D】Varying Kibibits FWT的相关文章

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

[题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是01,裸的,\(O(2^{cnt[?]})\) 默认问号是1,利用子集和求,\(O(2^{cnt[1]})\) 默认问号是0,利用超集和求,\(O(2^{cnt[0]})\) 可以知道\(min(cnt)\le n/3\),所以复杂度\(O(n2^n 2^{n/3}Q)\) //@winlere #

【HDU5909】Tree Cutting(FWT)

[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为\(0..m-1\)的所有子树的个数 题解 考虑\(dp\) 设\(f[i][j]\)表示以\(i\)为根节点的子树中,异或和为\(j\)的子树的个数 很显然,每次合并就是两个\(dp\)值做\(xor\)卷积 那么直接用\(FWT\)优化就行了 #include<iostream> #inclu

【CF662C】Binary Table(FWT)

[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可以将一行或者一列的\(01\)全部翻转 回答表格中最少有多少个\(1\) 题解 发现\(n\)很小,\(m\)很大 状压是跑不掉了 如果我们确定翻转哪些行,那么答案唯一确定(贪心的选每一列中\(0/1\)的较小值) 相同的列显然可以合并, 把每一列按照\(01\)状压,记\(a[i]\)为状态为\(i\)的列

【DataBase】sqlserver字段类型详解

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

HDOJ1057 A New Growth Industry 【模拟】

A New Growth Industry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1197    Accepted Submission(s): 474 Problem Description A biologist experimenting with DNA modification of bacteria has fou

【转】T-SQL 教程

1 USE [test] 2 GO 3 /****** Object: StoredProcedure [dbo].[PageIndex] Script Date: 12/07/2011 10:26:36 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 ALTER PROCEDURE [dbo].[PageIndex] 9 ( 10 @Tbname varchar(100),--表名字 11 @Strfield

【原创】MySQL 以及 Python 实现排名窗口函数

大部分数据库都提供了窗口函数,比如RANK,ROW_NUMBER等等. MySQL 这方面没有直接提供,但是可以变相的实现,我以前写了row_number 的实现,今天有时间把 rank 的实现贴出来. 这里,我用MySQL 以及Python 分别实现了rank 窗口函数. 原始表信息: t_girl=# \d group_concat; Table "ytt.group_concat" Column | Type | Modifiers ----------+------------

HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 291    Accepted Submission(s): 160 Problem Description On an isolated island, lived some dwarves. A king (not a dwarf) ruled t

【转】cocos2d-x游戏开发(十四)用shader使图片背景透明

转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个纯黑色背景,怎么样将内容显示出来,让背景透明呢?前段时间搞了一下,感谢群里的童鞋们,提供了思路和方法. 这里用shader处理了像素,使黑色背景透明,直接上代码 ShaderSprite.h 1 #ifndef __TestShader__ShaderSprite__ 2 #define __Tes