1 条题解

  • 1
    @ 2026-4-5 19:23:49
    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    int T;
    int n;
    const int mod = 1000000007;
    
    int main() {
        cin >> T;
        while(T--)
        {
            cin >> n;
            vector<int> a(n + 1, 0);
            int ans = 0;
            for (int i = 1; i <= n; i++)
            {
                cin >> a[i];
                ans = (ans + a[i]) % 2;
            }
    
            if (ans)
            {//总和为奇数,必然无结果
                cout << 0<<endl;
                continue;
            }
            vector<vector<int>> dp(n + 1, vector<int>(2, 0));
            //dp[j][k]:从前i个数中选取j个结果为k(0为偶奇为1)的方案数
            dp[0][0] = 1; //空集结果为0即偶数,方案数为1
    
            for (int i = 1; i <= n; i++)
            {//枚举前i个数
                for (int j = i; j >= 1; j--)
                {//枚举选取的个数,降维背包内层循环倒着遍历
                    if (a[i] % 2 == 1)
                    {//第i个数为奇数
                        //第i个数选取j个数结果为奇数
                        //i-1个数选取j个结果为奇数,或i-1个选取j-1个结果为偶数
                        dp[j][1] = (dp[j][1] + dp[j - 1][0]) % mod;
    
                        //第i个选取j个数结果为偶数
                        //i-1个选取j个结果为偶数,或i-1个选取j-1个结果为奇数
                        dp[j][0] = (dp[j][0] + dp[j - 1][1]) % mod;
                    }
                    else
                    {//第i个数为偶数
                        //第i个数选取j个数结果为奇数
                        //i-1个数选取j个结果为奇数,或i-1个选取j-1个结果为奇数
                        dp[j][1] = (dp[j][1] + dp[j - 1][1]) % mod;
    
                        //第i个选取j个数结果为偶数
                        //i-1个选取j个结果为偶数,或i-1个选取j-1个结果为偶数
                        dp[j][0] = (dp[j][0] + dp[j - 1][0]) % mod;
                    }
                }
            }
    
            ans = 0;
            for (int j = 0; j <= n; j++)ans = (ans + dp[j][0]) % mod;
            cout << ans << endl;
        }
      
    
        return 0;
    }
    

    信息

    ID
    465
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    110
    已通过
    25
    上传者