AtCoder Beginner Contest 050(ABCD)

A - Addition and Subtraction Easy

思路:依题意即可。

B - Contest with Drinks Easy

思路:简单模拟。

C - Lining Up

思路:乘法原理,用数组维护下每个数出现次数,注意特判下 n n n为奇数, 0 0 0只有一种,其他是两种.

int n;cin>>n;
	int f=1,jg=n&1;
	ll ans=1;
	int cnt=0;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(!x) cnt++;
		if(jg&&(x&1)) f=0;
		else if(!jg&&(x%2==0)) f=0;
		else if(jg&&cnt>1) f=0;
		if(!vis[x]){
		if(x) ans=ans*2%mod;
		vis[x]=1;
		} 
	}
	if(!f) cout<<0;
	else cout<<ans; 

D - Xor Sum

思路: d p dp dp

a ⊕ b ≤ a + b ≤ n a\oplus b\le a+b\le n aba+bn

考虑 a , b a,b a,b的奇偶性,默认 a ≤ b a\le b ab

1. a , b a,b a,b都为奇数.

{ ( 2 a 1 + 1 ) ⊕ ( 2 b 1 + 1 ) = u ( 2 a 1 + 1 ) + ( 2 b 1 + 1 ) = v \begin{cases}(2a_1+1)\oplus(2b_1+1)=u\\(2a_1+1)+(2b_1+1)=v\end{cases} {(2a1+1)(2b1+1)=u(2a1+1)+(2b1+1)=v

⇒ ( 2 a 1 + 1 ) + ( 2 b 1 + 1 ) ≤ n ⇒ a 1 + b 1 ≤ n − 2 2 \Rightarrow (2a_1+1)+(2b_1+1)\le n\Rightarrow a_1+b_1\le \dfrac{n-2}{2} (2a1+1)+(2b1+1)na1+b12n2

即:该情况贡献为: d p [ n − 2 2 ] dp[\dfrac{n-2}{2}] dp[2n2]

2. a , b a,b a,b都为偶数.

{ 2 a 1 ⊕ 2 b 1 = u 2 a 1 + 2 b 1 = v \begin{cases}2a_1\oplus2b_1=u\\2a_1+2b_1=v\end{cases} {2a12b1=u2a1+2b1=v

⇒ 2 a 1 + 2 b 1 ≤ n ⇒ a 1 + b 1 ≤ n 2 \Rightarrow 2a_1+2b_1\le n\Rightarrow a_1+b_1\le \dfrac{n}{2} 2a1+2b1na1+b12n

即:该情况贡献为: d p [ n 2 ] dp[\dfrac{n}{2}] dp[2n]

3. a , b a,b a,b一奇一偶.

{ ( 2 a 1 + 1 ) ⊕ 2 b 1 = u 2 a 1 + 2 b 1 + 1 = v \begin{cases}(2a_1+1)\oplus2b_1=u\\2a_1+2b_1+1=v\end{cases} {(2a1+1)2b1=u2a1+2b1+1=v

⇒ 2 a 1 + 2 b 1 + 1 ≤ n ⇒ a 1 + b 1 ≤ n − 1 2 \Rightarrow 2a_1+2b_1+1\le n\Rightarrow a_1+b_1\le \dfrac{n-1}{2} 2a1+2b1+1na1+b12n1

即:该情况贡献为: d p [ n − 1 2 ] dp[\dfrac{n-1}{2}] dp[2n1]

所以状态转移方程为: d p [ n ] = d p [ n 2 ] + d p [ n − 1 2 ] + d p [ n − 2 2 ] dp[n]=dp[\dfrac{n}{2}]+dp[\dfrac{n-1}{2}]+dp[\dfrac{n-2}{2}] dp[n]=dp[2n]+dp[2n1]+dp[2n2]

记忆化搜索一下即可。

时间复杂度: O ( l o g n ) O(logn) O(logn)

ll fun(ll n){
	if(dp[n]) return dp[n];
	return dp[n]=(fun(n/2)+fun((n-1)/2)+fun((n-2)/2))%mod;
}
dp[0]=1,dp[1]=2;ll n;

你可能感兴趣的:(Atcoder题解)