結果

問題 No.2144 MM
ユーザー milanis48663220milanis48663220
提出日時 2022-12-02 23:43:14
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,721 bytes
コンパイル時間 1,020 ms
コンパイル使用メモリ 115,500 KB
最終ジャッジ日時 2024-04-27 04:18:29
合計ジャッジ時間 1,560 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp: In function 'mint test(int, int)':
main.cpp:65:1: warning: no return statement in function returning non-void [-Wreturn-type]
   65 | }
      | ^
main.cpp: In instantiation of 'void print_vector(std::vector<_Tp>, char) [with T = atcoder::static_modint<998244353>]':
main.cpp:63:21:   required from here
main.cpp:41:46: error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and '__gnu_cxx::__alloc_traits<std::allocator<atcoder::static_modint<998244353> >, atcoder::static_modint<998244353> >::value_type' {aka 'atcoder::static_modint<998244353>'})
   41 |     for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter;
      |                                         ~~~~~^~~~~
In file included from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/iostream:39,
                 from main.cpp:1:
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/ostream:108:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(__ostream_type& (*)(__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  108 |       operator<<(__ostream_type& (*__pf)(__ostream_type&))
      |       ^~~~~~~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/ostream:108:36: note:   no known conversion for argument 1 from '__gnu_cxx::__alloc_traits<std::allocator<atcoder::static_modint<998244353> >, atcoder::static_modint<998244353> >::value_type' {aka 'atcoder::static_modint<998244353>'} to 'std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&)' {aka 'std::basic_ostream<char>& (*)(std::basic_ostream<char>&)'}
  108 |       operator<<(__ostream_type& (*__pf)(__ostream_type&))
      |                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/ostream:117:7: note: candidate: 'std::basic_ostream<_C

ソースコード

diff #

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <tuple>
#include <cmath>
#include <numeric>
#include <functional>
#include <cassert>
#include <atcoder/modint>

#define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl;
#define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

using namespace std;
typedef long long ll;

template<typename T>
vector<vector<T>> vec2d(int n, int m, T v){
    return vector<vector<T>>(n, vector<T>(m, v));
}

template<typename T>
vector<vector<vector<T>>> vec3d(int n, int m, int k, T v){
    return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, v)));
}

template<typename T>
void print_vector(vector<T> v, char delimiter=' '){
    if(v.empty()) {
        cout << endl;
        return;
    }
    for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter;
    cout << v.back() << endl;
}


const ll MOD = 998244353;
using mint = atcoder::modint998244353;

ostream& operator<<(ostream& os, const mint& m){
    os << m.val();
    return os;
}

mint test(int n, int m){
    auto dp = vec2d(n+1, m, mint(0));
    dp[0][0] = 1;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            for(int k = 0; k < m-1; k++){
                dp[i+1][(j+k)%m] += dp[i][j];
            }
        }
        print_vector(dp[i+1]);
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << setprecision(10) << fixed;
    int n, m; cin >> n >> m;
    // test(n, m);
    vector<int> a(n);
    for(int i = 0; i < n; i++) cin >> a[i];
    int sum = 0;
    for(int i = 0; i < n; i++){
        if(i%2 == 0) sum += a[i];
        else sum -= a[i];
        sum += m;
        sum %= m;
    }
    if(sum != 0){
        cout << -1 << endl;
        return 0;
    }
    mint ans = 1;
    int x = 0;
    for(int i = 0; i < n; i++){
        // ここで初めて小さくなるパターン
        if(a[i] > 0){
            int rem = n-i-1;
            if(rem == 0){
                continue;
            }
            mint tmp;
            mint offset;
            if(rem%2 == 0){
                mint ave = (mint(m-1).pow(rem)-1)/(m);
                tmp = ave*a[i];
                offset = 1;
            }else{
                mint ave = (mint(m-1).pow(rem)+1)/(m);
                tmp = ave*a[i];
                offset = -1;
            }
            int l = 0, r = 0;
            if(i%2 == 1){
                l = x-(a[i]-1);
                r = x;
            }else{
                l = x;
                r = x+a[i]-1;
            }
            if(i%2 == 0){
                l -= (rem/2)*2;
                r -= (rem/2)*2;
            }else{
                l -= ((rem+1)/2)*2;
                r -= ((rem+1)/2)*2;
            }
            
            l %= m;
            r %= m;
            l = (l+m)%m;
            r = (r+m)%m;
            int small_idx = (m-rem)%m;
            small_idx = (small_idx+m)%m;
            // cout << l << ' ' << r << ' ' << small_idx << endl;
            if(r >= l){
                if(l <= small_idx && small_idx <= r) {
                    tmp+=offset;
                }
            }else{
                if(small_idx >= l || small_idx <= r) {
                    tmp+=offset;
                }
            }
            ans += tmp;
        }
        if(i%2 == 0) x += a[i];
        else x += m-a[i];
        x %= m;
    }
    cout << ans << endl;
}
0