哥们改了一小时,从0->90,Wa#9
查看原帖
哥们改了一小时,从0->90,Wa#9
640477
biophitma_wby楼主2024/11/24 19:03

谢谢laoda(不是dalao)帮看一下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Mod=1000000007;
ll n,m,k;
struct Limit{
	ll x,y;
}lim[100005],removal[100005];
int len=0;
bool cmp(Limit a,Limit b){
	if(a.x==b.x)return a.y<b.y;
	else return a.x<b.x;
}
ll quick_row(ll a,ll b){
	ll ans=1,base=a%Mod;
	while(b){
		if(b&1!=0){
			ans*=base;
			ans%=Mod;
		}
		base*=base;
		base%=Mod;
		b>>=1;
	}
	return ans;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=1;i<=k;i++){
		scanf("%lld%lld",&lim[i].x,&lim[i].y);
	}
	sort(lim+1,lim+k+1,cmp);
	int num=1;
	while(num<=k){
		ll tmpx=lim[num].x,tmpy=lim[num].y;
		removal[++len].x=tmpx,removal[len].y=tmpy;
		num++;
		while(tmpx==lim[num].x&&tmpy==lim[num].y){
			num++;
		}
	}
	int cd=removal[1].x,cnt=1;
	for(int i=2;i<=len;i++){
		if(removal[i].x==cd){
			continue;
		}else{
			cd=removal[i].x;
			cnt++;
		}
	}
	ll sum=quick_row(n*(n+1)/2,m-cnt);
	ll tmp=n*(n+1)/2%Mod;
	tmp-=removal[1].y;
	for(int i=2;i<=len;i++){
		if(removal[i].x==removal[i-1].x){
			tmp-=removal[i].y%Mod;
		}else{
			sum*=tmp;sum%=Mod;
			tmp=n*(n+1)/2-removal[i].y;
			tmp%=Mod;
		}
	}
	sum*=tmp;sum%=Mod;
	printf("%lld",sum);
	return 0;
}
2024/11/24 19:03
加载中...