题解:P11362 [NOIP2024] 遗失的赋值(民间数据)
VinstaG173 · · 题解
随便做了做造了个民间数据。
考虑分段计算贡献后用乘法原理。先解决以下子问题:
反过来做,
对
又所有可能的
然后发现只有
从而设被限定了值的位置去重后为
注意需要判断是否有位置被赋了两个不同的值,用 map 维护即可做到时间复杂度
Code:
#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";
}