专栏文章
题解:P11362 [NOIP2024] 遗失的赋值(民间数据)
P11362题解参与者 8已保存评论 8
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @miqxt1wz
- 此快照首次捕获于
- 2025/12/04 12:29 3 个月前
- 此快照最后确认于
- 2025/12/04 12:29 3 个月前
随便做了做造了个民间数据。
考虑分段计算贡献后用乘法原理。先解决以下子问题:
- 确定,求合法的 数量。
反过来做, 不合法当且仅当:
对 , 有 种可能取值; 有 种可能取值,共 种。
又所有可能的 有 种,从而合法的 就有 种。
然后发现只有 值被限定时, 的 种可能值和 的 种可能值均合法。
从而设被限定了值的位置去重后为 ,则最终答案为 。
注意需要判断是否有位置被赋了两个不同的值,用
map 维护即可做到时间复杂度 ,空间复杂度 。Code:
CPP#define ll long long
const int mod=1e9+7;
inline ll qpw(ll x,int v=mod-2){
ll res=1;while(v){
if(v&1)res=res*x%mod;
x=x*x%mod,v>>=1;
}return res;
}
int n,m;
ll v,ans;
map<int,int>S;
map<int,int>::iterator ps,nx;
inline void solve(){
cin>>n>>m>>v;
S.clear();ans=1;
for(int i=0,c,d;i<m;++i){
cin>>c>>d;
if(S.count(c)&&S[c]!=d)ans=0;
else S[c]=d;
}if(!ans){
cout<<"0\n";
return;
}ps=nx=S.begin();
ans=qpw(v,((*nx).first-1)*2);++nx;
for(;nx!=S.end();++ps,++nx){
int x=(*ps).first,y=(*nx).first;
ans=ans*(qpw(v,(y-x)*2)-qpw(v,y-x-1)*(v-1)%mod+mod)%mod;
}ans=ans*qpw(v,(n-(*ps).first)*2)%mod;
cout<<ans<<"\n";
}
相关推荐
评论
共 8 条评论,欢迎与作者交流。
正在加载评论...