求问正确性
查看原帖
求问正确性
541069
SuperCowHorse楼主2024/11/30 19:45

为什么考场代码民间数据70分啊啊啊(要疯掉了)

大样例全过,第一个点 TLE了??

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=1e9+7;
inline ll QPow(ll x,ll y,ll p){
	ll res=1;
	for(;y;y>>=1,x=x*x%p){
		if(y&1) res=res*x%p;
	}
	return res;
}
ll n,v,V,ans,a[maxn];int m;
map<ll,ll>mp;
inline ll Calc(ll n){
	return (QPow(v,n+1,mod)-1)*V%mod;
}
inline void solve(){
	scanf("%lld%d%lld",&n,&m,&v);
	mp.clear();V=QPow(v-1,mod-2,mod);
	for(int i=1;i<=m;++i){
		ll x,y;scanf("%lld%lld",&x,&y);
		if(mp[x]!=0&&mp[x]!=y){
			printf("0\n");
			return;
		}
		mp[x]=y;a[i]=x;
	}
	sort(a+1,a+1+m);m=unique(a+1,a+1+m)-a-1;
	ans=QPow(v,2*(a[1]-1),mod);
	for(int i=2;i<=m;++i){
		ll o=a[i]-a[i-1];
		ll res=(v-1)*(Calc(o*2-1)-Calc(o-1))%mod;
		if(res<mod) res+=mod;
		res=(res+QPow(v,o-1,mod));
		ans=ans*res%mod;
	}
	if(a[m]!=n){
		a[++m]=n;
		for(int i=m;i<=m;++i){
			ll o=a[i]-a[i-1];
			ll res=(v-1)*(Calc(o*2-1)-Calc(o-1))%mod;
			if(res<mod) res+=mod;
			res=(res+QPow(v,o,mod));
			ans=ans*res%mod;
		}
	}
	printf("%lld\n",ans);
}
signed main(){
	freopen("assign2.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;for(scanf("%d",&T);T;--T) solve();
	return 0;
}
2024/11/30 19:45
加载中...