Auto_Accepted @ 2024-11-30 21:29:12
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
。
by lhz2022 @ 2024-11-30 21:33:43
@Auto_Accepted 不用你设,它本来就是0
by Auto_Accepted @ 2024-11-30 21:35:13
@lhz2022 哦是的谢谢