(21条未读通知) 牛客练习赛101_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
题意:
思路:
组合数学+bitmask
第一个条件很好想
第二个条件是和为奇
序列的和为奇,说明序列中奇数的个数为奇数
那么这样就很像异或了,一个序列的异或和某位为1的充要条件是这一位的1的个数是奇数
所以这是一个关于异或的组合问题
这类问题一般让其中一个数控制整个序列在这一位的异或结果,然后让序列的其他数的二进制位随机排列,去算组合数
与此题相似的有:(144条消息) 【bitmask】牛客挑战赛 B 清新题_Lamenn的博客-CSDN博客
因此在该题中,我们用a1去控制整体的序列和的奇偶性
a1为0还是为1是确定的
让序列中其他数按第一个条件排列,算组合数即可
最后的答案是:(n+1)!/2
Code:
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
#define int long long
int n,ans=1;
signed main(){
scanf("%lld",&n);
for(int i=3;i<=n+1;i++) ans=(ans*i)%mod;
printf("%lld\n",(ans%mod));
}
总结:
一些奇偶性的性质:
当和为奇数时,序列中奇数的个数是奇数,序列中的其中一个数改变奇偶性可以控制整个序列的和的奇偶性,这和异或和一样,序列中1的个数决定了整个序列的异或和
当积为奇数时,序列中全是奇数
当遇到异或和或和为奇数的组合问题时,可以考虑控制一个数的奇偶性来控制整个序列的和或异或和