比赛 |
2025.1.14 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
遗失的赋值 |
最终得分 |
100 |
用户昵称 |
wdsjl |
运行时间 |
1.569 s |
代码语言 |
C++ |
内存使用 |
4.43 MiB |
提交时间 |
2025-01-14 20:46:38 |
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int Mod=1e9+7;
const int Maxn=1e6+7;
struct jz{
ll sum[5][5];
void clear(){
memset(sum,0,sizeof(sum));
}
void init(){
sum[0][0]=1;
sum[1][1]=1;
}
jz(){
clear();
}
};
jz operator*(const jz x,const jz y){
jz z;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
z.sum[i][j]=(z.sum[i][j]+x.sum[i][k]*y.sum[k][j]%Mod)%Mod;
}
}
}
return z;
}
jz qpw(jz x,int p){
jz z;
z.init();
while(p){
if(p&1)z=z*x;
x=x*x;
p>>=1;
}
return z;
}
int T,n,m,v;
int main(){
freopen("assign.in","r",stdin);
freopen("assign.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&v);
map<int,int>mp;
bool tag=1;
for(int i=1;i<=m;i++){
int c,d;
scanf("%d%d",&c,&d);
if(mp[c]&&mp[c]!=d) tag=0;
mp[c]=d;
}
if(!tag){
// puts("0");
printf("0\n");
continue;
}
jz ans,trs1,trs2;
if(mp[1]) ans.sum[0][1]=1;
else ans.sum[0][0]=1;
trs1.sum[0][0]=1ll*v*v%Mod;
trs1.sum[1][0]=1ll*v*(v-1)%Mod;
trs1.sum[1][1]=v;
trs2.sum[0][1]=1ll*v*v%Mod;
trs2.sum[1][1]=1ll*(v-1)*v%Mod+1;
int lst=1;
for(auto i:mp){
int ps=i.first;
if(ps==1) continue;
ans=ans*qpw(trs1,ps-lst-1);
ans=ans*trs2;
lst=ps;
}
ans=ans*qpw(trs1,n-lst);
printf("%lld\n",(ans.sum[0][0]+ans.sum[0][1])%Mod);
}
return 0;
}