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 a⊕b≤a+b≤n
考虑 a , b a,b a,b的奇偶性,默认 a ≤ b a\le b a≤b
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)≤n⇒a1+b1≤2n−2
即:该情况贡献为: d p [ n − 2 2 ] dp[\dfrac{n-2}{2}] dp[2n−2]
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} {2a1⊕2b1=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+2b1≤n⇒a1+b1≤2n
即:该情况贡献为: 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+1≤n⇒a1+b1≤2n−1
即:该情况贡献为: d p [ n − 1 2 ] dp[\dfrac{n-1}{2}] dp[2n−1]
所以状态转移方程为: 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[2n−1]+dp[2n−2]
记忆化搜索一下即可。
时间复杂度: 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;