結果
問題 | No.314 ケンケンパ |
ユーザー | yuppe19 😺 |
提出日時 | 2015-12-07 00:45:14 |
言語 | C++11 (gcc 13.3.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 4,109 bytes |
コンパイル時間 | 332 ms |
コンパイル使用メモリ | 52,748 KB |
最終ジャッジ日時 | 2024-11-14 19:30:10 |
合計ジャッジ時間 | 903 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:57:1: error: ‘vector’ does not name a type 57 | vector<vector<vector<modint>>> dp; | ^~~~~~ main.cpp: In function ‘int main()’: main.cpp:83:3: error: ‘dp’ was not declared in this scope 83 | dp.assign(2, vector<vector<modint>>(3, vector<modint>(3))); | ^~ main.cpp:83:16: error: ‘vector’ was not declared in this scope 83 | dp.assign(2, vector<vector<modint>>(3, vector<modint>(3))); | ^~~~~~ main.cpp:3:1: note: ‘std::vector’ is defined in header ‘<vector>’; did you forget to ‘#include <vector>’? 2 | #include <algorithm> +++ |+#include <vector> 3 | using namespace std; main.cpp:83:36: error: expected primary-expression before ‘>>’ token 83 | dp.assign(2, vector<vector<modint>>(3, vector<modint>(3))); | ^~ main.cpp:83:55: error: expected primary-expression before ‘>’ token 83 | dp.assign(2, vector<vector<modint>>(3, vector<modint>(3))); | ^ main.cpp:82:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 82 | scanf("%d", &n); | ~~~~~^~~~~~~~~~
ソースコード
#include <iostream> #include <algorithm> using namespace std; using i64 = long long; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x<lhs.x;}void operator++(){++x;}};I i,n; public:range(int n):i({0}),n({n}){}range(int i,int n):i({i}),n({n}){}I& begin(){return i;}I& end(){return n;}}; template <int mod> struct Modint { static const Modint* none; // *modint::none long long x; Modint(void) { x = 0; }; Modint(long long a) { x = (a%mod+mod)%mod; }; Modint(string s) { x = 0; for(char c : s) { (x *= 10) += (c - '0'); x %= mod; } // if(!x) { x = mod; } }; static Modint* noneInstance(void) { Modint* res = new Modint(); res->x = -1; return res; } bool is_none(void) { return x == -1; } Modint operator + (const Modint a) { return Modint(*this) += a; } Modint operator - (const Modint a) { return Modint(*this) -= a; } Modint operator * (const Modint a) { return Modint(*this) *= a; } Modint operator * (const long long a) { return Modint(*this) *= (a%mod+mod)%mod; } friend Modint operator * (const long long a, const Modint& b) { return Modint(b) *= (a%mod+mod)%mod; } Modint operator +=(const Modint& a) { if((x+=a.x)>=mod) { x-=mod; } return *this; } Modint operator -=(const Modint& a) { if((x-=a.x)<0) { x+=mod; } return *this; } Modint operator *=(const Modint& a) { (x*=a.x)%=mod; return *this; } Modint operator *=(const long long a) { (x*=(a%mod+mod)%mod)%=mod; return *this; } /* a++ */ Modint operator ++(int) { Modint old; old.x = x; if((x+=1)>=mod) { x-=mod; }; return old; } /* ++a */ Modint operator ++(void) { *this += 1; return *this; } /* a-- */ Modint operator --(int) { Modint old; old.x = x; if((x-=1)<0) { x+=mod; }; return old; } /* --a */ Modint operator --(void) { *this -= 1; return *this; } bool operator ==(const Modint& a) const { return x == a.x; } bool operator ==(const long long a) const { return x == (a%mod+mod)%mod; } bool operator !=(const Modint& a) const { return !(x == a.x); } bool operator !=(const long long a) const { return x != (a%mod+mod)%mod; } int intvalue(void) const { return (int)x; } Modint pow(const long long n){ Modint res = 1; long long p = x; for(long long i=n; i>0; i>>=1) { if(i & 1) { res *= p; } (p *= p) %= mod; } return res; } }; template <int mod> const Modint<mod>* Modint<mod>::none = Modint<mod>::noneInstance(); const int mod = 1000000007; using modint = Modint<mod>; vector<vector<vector<modint>>> dp; int n; //modint rec(int i, int x2, int x1) { // modint &res = dp[i&1][x2][x1]; // if(i == n) { return res = modint(1); } // if(res != *modint::none) { return res; } // res = 0; // if(x2 == 1 && x1 == 1) { // res = rec(i+1, x1, 2); // } else if(x2 == 2 && x1 == 1) { // res = rec(i+1, x1, 1) + rec(i+1, x1, 2); // } else if(x2 == 1 && x1 == 2) { // res = rec(i+1, x1, 1); // } else if(x2 == 0 && x1 == 0) { // res = rec(i+1, x1, 1); // } else if(x2 == 0 && x1 == 1) { // res = rec(i+1, x1, 1) + rec(i+1, x1, 2); // } else { // fprintf(stderr, "x2=%d, x1=%d\n", x2, x1); // } // return res; //} int main(void) { scanf("%d", &n); dp.assign(2, vector<vector<modint>>(3, vector<modint>(3))); // modint res = rec(0, 0, 0); dp[0][0][0] = 1; for(int i : range(n)) { int bi = i & 1, bni = !bi; // (x2, x1) = (0, 0) -> [1] dp[bni][0][1] += dp[bi][0][0]; // (x2, x1) = (0, 1) -> [1, 2] dp[bni][1][1] += dp[bi][0][1]; dp[bni][1][2] += dp[bi][0][1]; // (x2, x1) = (0, 2) -> X // nop // (x2, x1) = (1, 1) -> [2] dp[bni][1][2] += dp[bi][1][1]; // (x2, x1) = (1, 2) -> [1] dp[bni][2][1] += dp[bi][1][2]; // (x2, x1) = (2, 1) -> [1, 2] dp[bni][1][1] += dp[bi][2][1]; dp[bni][1][2] += dp[bi][2][1]; for(int x2 : range(3)) { for(int x1 : range(3)) { dp[bi][x1][x2] = 0; } } } modint res = dp[n&1][0][0] + dp[n&1][0][1] + dp[n&1][1][1] + dp[n&1][1][2] + dp[n&1][2][1]; printf("%d\n", res.intvalue()); return 0; }