首页 > 其他分享 >CF1770F Koxia and Sequence

CF1770F Koxia and Sequence

时间:2023-03-29 14:48:23浏览次数:59  
标签:ch Sequence text args bigoplus put Koxia subseteq CF1770F

CF1770F Koxia and Sequence

题目链接

\(\text{difficulty}={\color{red}6},1\)。

\(\text{tags}=组合数学,子集反演,容斥原理,二进制\)。

神仙题。

首先进行观察。由于计算式与每个数在那个位置无关,所以每个位置都是相同的。

可以将 \(\bigoplus_a \bigoplus_{i=1}^n a_i\) 转化为 \(\bigoplus_{i=1}^n \bigoplus_a a_i\),即对每个位置求出其贡献后将每个位置异或起来。由于每个位置都是相同的,所以当 \(n\) 为偶数时会贡献偶数次抵消掉了,答案为 \(0\);当 \(n\) 为奇数时会贡献奇数次,那么我们只需要计算 \(a_1\) 的贡献即可。

注意到计算式中有 \(\text{OR}\),考虑对 \(a_1\) 的每一位计算当前位为 \(1\) 的方案数。由于最终的答案为异或形式,所以只需要求出每一位答案的奇偶性即可。接下来讨论当 \(a_1\) 的第 \(i\) 位被钦定为 \(1\) 时的贡献,下面我们将 \(a_1\) 减掉 \(2^i\)。

由于有一个求和的限制和一个 \(\text{OR}\) 的限制,无法同时处理,考虑固定一个容斥另一个。

较为合理的做法是固定和然后容斥 \(\text{OR}\),因为如果仅知道 \(\text{OR}\) 的信息来确定和较为困难。设 \(f_s\) 表示在 \(a_1\) 的第 \(i\) 位为 \(1\) 并且和满足条件的前提下,\(\text{OR}\) 恰好为 \(s\) 的方案数,\(g_s\) 表示在 \(a_1\) 的第 \(i\) 位为 \(1\) 并且和满足条件的前提下,\(\text{OR}\) 为 \(s\) 的子集的方案。

根据子集反演可以得到

\[f_s=\sum_{t\subseteq s} (-1)^{|s|-|t|}g_t \]

由于我们只关心奇偶性,所以可以变形 \(f_s=\bigoplus_{t\subseteq s}g_t\)。

接下来考虑如何求出 \(g_s\)。我们将最暴力的式子列出来,可以得到(由于只关心奇偶性,所以可以直接用异或)

\[g_S=\bigoplus\limits_{\sum_{i=1}^n a_i=x-2^i} [a_1\subseteq (s-2^i)][a_2\subseteq s][a_3\subseteq s]\dots[a_n\subseteq s] \]

接下来是最神仙的一步。考虑一个有关组合数奇偶性的公式 \(\binom{n}{m}\bmod 2=[m\subseteq n]\),接下来我们考虑逆用这个公式。那么可以得到

\[g_s=\left(\sum_{\sum_{i=1}^n a_i=x-2^i} \binom{s-2^i}{a_1}\binom{s}{a_2}\binom{s}{a_3}\dots\binom{s}{a_n}\right)\bmod 2 \]

发现中间是范德蒙德卷积的形式,直接化简得到

\[g_s=\binom{ns-2^i}{x-2^i}\bmod 2=[(x-2^i)\subseteq (ns-2^i)] \]

此时一个 \(g_s\) 可以在 \(\mathcal{O}(1)\) 的时间复杂度内计算。回到原问题,我们需要 \(\mathcal{O}(\log y)\) 枚举一个选择的位,然后 \(\mathcal{O}(y)\) 枚举 \(s\) 并 \(\mathcal{O}(1)\) 计算 \(g_t\) 得到 \(f_s\),则总时间复杂度 \(\mathcal{O}(y \log y)\)。

code
#include<bits/stdc++.h>
using namespace std;
namespace IO{
	template<typename T>inline bool read(T &x){
		x=0;
		char ch=getchar();
		bool flag=0,ret=0;
		while(ch<'0'||ch>'9') flag=flag||(ch=='-'),ch=getchar();
		while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(),ret=1;
		x=flag?-x:x;
        return ret;
	}
	template<typename T,typename ...Args>inline bool read(T& a,Args& ...args){
	    return read(a)&&read(args...);
	}
	template<typename T>void prt(T x){
		if(x>9) prt(x/10);
		putchar(x%10+'0');
	}
	template<typename T>inline void put(T x){
		if(x<0) putchar('-'),x=-x;
		prt(x);
	}
	template<typename T>inline void put(char ch,T x){
		if(x<0) putchar('-'),x=-x;
		prt(x);
		putchar(ch);
	}
	template<typename T,typename ...Args>inline void put(T a,Args ...args){
	    put(a);
		put(args...);
	}
	template<typename T,typename ...Args>inline void put(const char ch,T a,Args ...args){
	    put(ch,a);
		put(ch,args...);
	}
	inline void put(string s){
		for(int i=0,sz=s.length();i<sz;i++) putchar(s[i]);
	}
	inline void put(const char* s){
		for(int i=0,sz=strlen(s);i<sz;i++) putchar(s[i]);
	}
}
using namespace IO;
#define int long long
int n,X,Y,ans;
signed main(){
	read(n,X,Y);
	if(!(n&1)) return puts("0"),0;
	for(int i=0;i<=20;i++){
		if(!(Y>>i&1)) continue;
		int res=0;
		for(int s=0;s<(1<<20);s++) 
			if((s>>i&1)&&(Y&s)==s&&((n*s-(1ll<<i))&(X-(1ll<<i)))==(X-(1ll<<i))) res^=1;
		ans|=res<<i;
	}
	put('\n',ans);
	return 0;
}

标签:ch,Sequence,text,args,bigoplus,put,Koxia,subseteq,CF1770F
From: https://www.cnblogs.com/fzj2007/p/17268844.html

相关文章

  • CF743B Chloe and the sequence 题解 分治
    题目链接:http://codeforces.com/problemset/problem/743/B题目大意:对于一个n-序列,如果n==0,那么它是一个空的序列(也就是说空序列中没有元素)。然后会进行i次操作,每次......
  • CF1806C-Sequence Master
    题目地址题意:给出m和一个长度为2m的数组a,令数组b长度也为m,且对于b任意一个长度为m的子序列的积等于剩下的和,求出最小的Σ|a[i]-b[i]|Solution显然只有一下几种情况:1.m=......
  • [ABC276G] Count Sequences 题解
    考虑差分,设\(d_i=a_i-a_{i-1}\),特别的,\(d_1=a_1\),那么约束就变成了\(\displaystyle\sumd_i\lem\)。对所有\(i>1\)有\(d_i\not\equiv0\pmod3\)。发现\(d_1\)......
  • python 报错"ValueError: dictionary update sequence element #0 has length 6; 2 is
    python报错"ValueError:dictionaryupdatesequenceelement#0haslength6;2isrequired"现象   分析根据报错分析,应该是字典或格式有问题,检查发现LOGGING......
  • Sequence Master CF2B (构造)
         后记;先贪心的想想能在n内构造出的情况是什么样子的用特殊数字去构造,或者暴力打一个表,来观察规律......
  • CF 1368B Codeforces Subsequences
    题目地址题意:给你一个数n,构造一个字符串,使得至少有n个子串为codeforcesSolution用贪心的思想肯定是只在codeforces基础上修改对于每个字符,对答案的贡献都是乘以字符的......
  • biopython Sequence相关
    参考:http://biopython.org/DIST/docs/tutorial/Tutorial.html1.构建Seq()对象fromBio.SeqimportSeqmyseq=Seq("AGTACACTCA")print(myseq)#AGTACACTCAprint(typ......
  • C. Sequence Master
    C.SequenceMasterForsomepositiveinteger$m$,YunQianconsidersanarray$q$of$2m$(possiblynegative)integersgood,ifandonlyifforeverypossibles......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)/*进行转换,可以要存储i^a[i]的值首先确保前面都是相同的然后假设下一位是不相同的,那么会在这里进行更新,都枚举一下就可以了字......
  • The Indian World: On the Achievements and Consequences of Stereotypes.-------lea
      Thistimewelearnedapoemnamed"IamnottheIndianinyourmind".ThispoemtellsaboutthestereotypeofIndiansintheworldandtheirviewsonth......