看看写成这样有没有问题?民间数据最多300ms能过
查看原帖
看看写成这样有没有问题?民间数据最多300ms能过
1127572
AlephZero0楼主2024/12/4 16:44
#include <bits/stdc++.h>
#define int long long
const int Maxn=100010,p=1e9+7;
using namespace std;
int T,n,m,v,ans,len;

struct Node
{
    int num;
    int val;
}a[Maxn];
int qp(int a,int x)
{
    int ans=1;
    while(x){
        if(x&1){
            ans=ans*a%p;
        }
        x>>=1;
        a=a*a%p;
    }
    return ans;
}
bool cmp(Node a,Node b)
{
    return a.num<b.num;
}
signed main()
{
    //freopen("cod.in","r",stdin);
    //freopen("cod.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        ans=1;
        memset(a,0,sizeof(a));
        scanf("%d%d%d",&n,&m,&v);
        len=n-1;
        for(int i=1;i<=m;i++){
            scanf("%d%d",&a[i].num,&a[i].val);
        }
        sort(a+1,a+m+1,cmp);
        int prenum=-1,len1=0;
        for(int i=1;i<=m;i++){
            if(a[i].num==a[i-1].num){
                if(a[i].val!=a[i-1].val){
                    ans=0;
                    break;
                }
            }
            else if(a[i].num==prenum+1){
                len1++;
                prenum++;
            }
            else{
                if(prenum==-1){
                    prenum=a[i].num;
                    continue;
                }
                int len2=a[i].num-a[i-1].num;
                ans=ans*( qp(v,2*len2)+ p -((v-1)*qp(v,len2-1))%p  )%p;
                len-=len2;
                prenum=a[i].num;
            }
        }
        if(ans==0){
            printf("%d\n",ans);
            continue;
        }
        len-=len1;
        ans=ans*qp(v,2*len)%p;
        ans=ans*qp((v*v-v+1)%p,len1)%p;
        printf("%d\n",ans);
    }
}

2024/12/4 16:44
加载中...