比赛 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;
}