我们可以求出每个开关需要按的次数的奇偶性 这个是唯一的 从大到小要翻就翻即可 假设我们求出来奇偶性
xi∈{0,1}
如果
∑xi≤k
那么 会直接减到0 否则 随机取一个
xi←1−xi
那么我们令 fx 为 ∑xi=x 时 第一次变为 x−1 的期望步数
那么有
fi=1,i≤k
和
fi=in+(1−in)∗(1+fi+1+fi)
化简一下就是
fi=n+(n−i)∗fi+1i
答案就是 n!∗∑xi=1fi
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int P=100003;
const int N=100005;
ll inv[N];
int n,K,a[N],x[N];
ll f[N];
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d%d",&n,&K); for (int i=1;i<=n;i++) scanf("%d",a+i);
inv[1]=1; for (int i=2;i<=n;i++) inv[i]=(ll)(P-P/i)*inv[P%i]%P;
int sum=0; ll fac=1;
for (int i=n;i;i--){
x[i]=a[i];
for (int j=i+i;j<=n;j+=i)
x[i]^=x[j];
sum+=x[i]; (fac*=i)%=P;
}
for (int i=1;i<=K;i++) f[i]=1;
for (int i=n;i>K;i--)
f[i]=(n+(n-i)*f[i+1])*inv[i]%P;
ll ans=0;
for (int i=1;i<=sum;i++)
ans+=f[i];
printf("%d\n",ans%P*fac%P);
return 0;
}