记录编号 |
598146 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2024]遗失的赋值 |
最终得分 |
100 |
用户昵称 |
djyqjy |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.236 s |
提交时间 |
2025-01-15 12:59:10 |
内存使用 |
4.86 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
char c=getchar();
int num=0,f=1;
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
return num*f;
}
const int N=100010,MOD=1e9+7;
int t;
int n,m,v;
int c[N];
int ans;
int mul;
int qpow(int a,int b)
{
mul=1;
while(b)
{
if(b&1) mul=mul*a%MOD;
b>>=1;
a=a*a%MOD;
}
return mul;
}
map<int,int> mp;
bool flag;
int x;
int num;
signed main()
{
freopen("assign.in","r",stdin);
freopen("assign.out","w",stdout);
t=read();
while(t--)
{
num=0;
flag=0;
n=read();m=read();v=read();
for(int i=1;i<=m;i++)
{
c[i]=read();x=read();
if(mp.count(c[i])&&mp[c[i]]!=x)
{
printf("0\n");
flag=1;
break;
}
if(mp.count(c[i])) c[i]=n+1,num++;
else mp[c[i]]=x;
}
mp.clear();
if(flag) continue;
sort(c+1,c+1+m);
m-=num;
ans=qpow(v,2*(c[1]-1))*qpow(v,2*(n-c[m]))%MOD;
for(int i=2;i<=m;i++)
ans=((qpow(v,2*(c[i]-c[i-1]))-qpow(v,c[i]-c[i-1])+qpow(v,c[i]-c[i-1]-1))%MOD+MOD)%MOD*ans%MOD;
printf("%lld\n",ans);
}
return 0;
}