求助这样为啥是对的

P11362 [NOIP2024] 遗失的赋值

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 哦是的谢谢


|