cf1610 D. Not Quite Lee
题意:
定义一个非空数组 \(a_1,a_2,\dots ,a_m\) 是好的,当且仅当存在 \(m\) 个整数序列 \(seq_1,seq_2,\dots ,seq_m\),\(seq_i\) 的长度恰为 \(a_i\) 且里面的数连续(从左到右每次 +1),且 \(sum(seq_1)+sum(seq_2)+\dots+ sum(seq_m)=0\)
思路:
设首项为 \(a_i\),就是要判断是否存在一组 \(a_i\) 使得
把右边搞成常数,
根据裴蜀定理,方程有解 \(\iff g|\sum \frac{b_i(b_i-1)}2\iff 2|\sum \frac{b_i(b_i-1)}g\)
其中 \(g=\gcd(b_1,\dots , b_n)\)
\(g\) 本来就能整除 \(b_i(b_i-1)\),现在要求除以 \(2\) 之后还能整除,那么自然要讨论一下因数中 \(2\) 的指数
任何数都能写成 \(2\) 的幂乘某个奇数,设 \(b_i=2^x\cdot odd, g=2^y\cdot odd, 0\le y\le x\)
若存在某个 \(b_i\) 是奇数,那么 \(g\) 也是奇数,所以 \(g\) 没法消掉任何 \(b_i(b_i-1)\) 中的因子 \(2\),于是整个式子成立;
若 \(b_i\) 全是偶数,则 \(b_i-1\) 是奇数。显然当 \(x>y\) 时成立;而当 \(x=y\) 时 \(\frac{b_i(b_i-1)}g\) 是个奇数所以不成立。
于是要求使得 \(x=y\) 的 \(b_i\) 有偶数个。
实现就很简单了:要么只取奇数;要么取 $2/4/6/8/\dots $ 个 “因子中 \(2\) 的指数相等” 的偶数,然后随便取一些奇数和 “因子中 \(2\) 的指数更大” 的偶数
int cnt[32];
void sol() {
int n; cin >> n; for(int i = 1; i <= n; i++) {
int x; cin >> x;
int c = 0; while(x % 2 == 0) x /= 2, c++;
cnt[c]++;
}
ll ans = 0;
for(int i = 0; i <= 31; i++) if(cnt[i]) {
n -= cnt[i]; //比它大的有多少
if(!i) ans = add(ans, (qmi(2,cnt[0])-1) * qmi(2,n)); //有奇数一定行
else ans = add(ans, (qmi(2,cnt[i]-1)-1) * qmi(2,n));
}
cout << ans;
}

浙公网安备 33010602011771号