TJ For 命中注定的抉择
出题人题解。
Sub1 显然答案为
Sub2 是给深搜的,枚举每个盒子怎么放即可。
所以从 Sub3 开始讲。
Subtask #3
假设其中一个盒子共放置
Subtask #4
考虑能否从 Sub3 的结论拓展,尽量每个黑子都只放一个盒子,正确性是肯定的。
每个盒子最多只能为答案提供
Subtask #5
现在,我们需要考虑有嵌套的情况。由于一开始我们已经选择了一些盒子只放黑子,现在在第二层的角度上完全可以把它们当作黑子,因为只要摸到它们就一定会摸到黑子。接下来就可以像之前一样放了。若
Subtask #6
我们把
当然,也可以用递归分治处理,不过空间复杂度较高,不宜 #define int long long。
Subtask #7
现在我们不能开数组预处理,但是可以把它压成一个变量,只需要单独维护分子和分母就行了。
这个 Sub 的意义是用来卡掉一些奇怪做法的。
Code
#include<bits/stdc++.h>
#define ll long long
#define mid ((l+r)>>1)
using namespace std;
const ll mod=998244353;
ll n,m,cn,cm,a,k,d,x;
inline ll inv(ll n){
ll res=1,m=mod-2;
while(m){
if(m&1)res=res*n%mod;
n=n*n%mod,m>>=1;
}
return res;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m>>k>>a>>d>>x;
for(int i=1;i<=k;i++){
if(a>n)m=a-n-!!cn;
else
if(m)cn=n-a+1,cm=m,n=a-1,m=0;
else cn=((cn+cm)%mod*(n-a+2)%mod-cm+mod)%mod,n=a-1;
a=a-d^x;
}
if(cn)cout<<(cn+(cn+cm)*n%mod)%mod*inv((cn+cm)*(n+1)%mod)%mod;
else cout<<n*inv(n+m)%mod;
return 0;
}