题解:AT_arc227_e [ARC227E] Shift and XOR Switches
maxiaoxiao111 · · 题解
首先考虑做两次操作,间隔分别为
观察这个式子,发现操作顺序不重要。
思考操作序列满足什么条件时
那么接下来只要考虑重复元素对操作序列的影响了,套一下上面的式子,得到:
也就是操作两次
进一步想到可以依据每个数除去
对于一个类内的一个数字设其质因数分解后
而我们希望通过这样一些操作最后凑出的等价操作集合不同,也就相当于操作的
Code:
#include<bits/stdc++.h>
using namespace std;
const int N = 200005, mod = 998244353;
int n, m, a[N];
map <int, bool> mp;
long long ans = 1;
int dick(int x){
while(!(x & 1)){
x >>= 1;
}
return x;
}
inline int add(int x, int y){
x += y;
if(x >= mod)x -= mod;
return x;
}
int dfs(int p, int num){
if(p >= n)return 1;
int c = num + a[p];
int res = dfs(p << 1, c >> 1);
if(c)res = add(res, dfs(p << 1, c - 1 >> 1));
return res;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1;i <= m;i++){
int x;scanf("%d", &x);
a[x]++;mp[dick(x)] = 1;
}
for(auto t : mp){
int p = t.first;
ans = ans * dfs(p, 0) % mod;
}
printf("%lld", ans);
return 0;
}