求助这样为啥是对的
查看原帖
求助这样为啥是对的
756684
寄风孤影楼主2024/11/30 21:29

RT,lz 在重写代码时发现自己多测没清空过了所有大样例。

害怕的交上去,直接过了。

所以是不是不需要清空。

代码如下:

#include <bits/stdc++.h>
using namespace std ; 
#define int long long
const int N = 1e5 + 5  , mod = 1e9 + 7; 
pair<int,int>aa[N];
int n , m , v , a[N] , dp[N][2];
inline int ksm(int a , int b){
	int res = 1;
	while(b){
		if(b&1) (res *= a) %= mod;
		(a *= a) %= mod;
		b >>= 1;
	}
	return res;
}
inline void solve(){
	cin >> n >> m >> v ; 
	unordered_map<int,int> mp;
	for(int i = 1;i <=  m ; i++ ) {
		 cin >> aa [ i  ]  .first >> aa [  i  ].second   ; 
	}
	for(int i  = 1; i <= m ;  i++){
		a[i] = aa[i].first;
		if(mp[aa[i].first]){
			if(mp[aa[i].first] != aa[i].second){
				cout<<"0\n";
				return ;
			}
		}
		else mp[aa[i].first] = aa[i].second;
	}
	sort(a+1,a+m+1);
	m  =unique(a+1,a+m+1)-a-1;
	int res = ksm(v , n - 1);
	res *= res;
	res %= mod;
	dp[1][1] = ksm(v , a[1] - 1);
	dp[1][1] *= dp[1][1];
	dp[1][1] %= mod;
	for(int i = 2;i <=  m ; i ++  ){
		int t1 = ksm(v , a[i] - a[i - 1]);
		dp [ i  ] [ 0  ]  =  dp[i  -  1] [ 0  ]  * t1%mod*t1%mod;
		dp[i][0] += dp[i-1][1] * ksm(v,a[i]-a[i-1]-1) % mod * (v-1) % mod;
		dp[i][1] = ksm(v , a[i] - 1) * ksm(v , a[i] - 1) % mod + mod;
		dp[i][1] -= dp[i][0];
		dp[i][1] %= mod;
	}
	dp[m][0] *= ksm(v , n - a[m]);
	dp[m][0] %= mod;
	dp[m][0] *= ksm(v , n - a[m]);
	dp[m][0] %= mod;
	res -= dp[m][0];
	res += mod;
	res %= mod;
	cout<<res<<'\n';
}
signed main(){
	// freopen("assign3.in" , "r" , stdin);
	// freopen("assign.out" , "w"  ,stdout);
	ios::sync_with_stdio(0);
	cin.tie(0) , cout.tie(0 )  ;
	int _;
	cin >> _;
	while(_--) solve();
	return 0;
}

可以发现,我并没有将 dp[1][0] 设为 0

2024/11/30 21:29
加载中...