結果
問題 | No.685 Logical Operations |
ユーザー | pazzle1230 |
提出日時 | 2018-05-11 23:36:35 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,214 bytes |
コンパイル時間 | 1,511 ms |
コンパイル使用メモリ | 167,072 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-28 09:03:54 |
合計ジャッジ時間 | 2,418 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 27 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define INF_LL (int64)1e18 #define INF (int32)1e9 #define REP(i, n) for(int i = 0;i < (n);i++) #define FOR(i, a, b) for(int i = (a);i < (b);i++) #define all(x) x.begin(),x.end() #define fs first #define sc second using int32 = int_fast32_t; using uint32 = uint_fast32_t; using int64 = int_fast64_t; using uint64 = uint_fast64_t; using PII = pair<int32, int32>; using PLL = pair<int64, int64>; const double eps = 1e-10; template<typename A, typename B>inline void chmin(A &a, B b){if(a > b) a = b;} template<typename A, typename B>inline void chmax(A &a, B b){if(a < b) a = b;} using PDI = pair<double, int32>; const int64 mod = 1e9+7; int64 dp[64][2][2][2] = {}; int64 N; int64 dfs(int32 d=62, int32 tight=1, int32 zero=1, int32 sat=0){ if(d == -1) return sat; int64 &ret = dp[d][tight][zero][sat]; if(~ret) return ret; int32 lim = (tight ? (N >> d & 1) : 1); ret = 0; REP(i, lim+1){ REP(j, (zero ? lim+1 : 2)){ if(zero && (i < j || i+j == 2)) continue; ret += dfs(d-1, tight&(i == lim), zero&(i+j==0), sat|(!zero & i+j == 2)); ret %= mod; } } return ret; } int main(void){ cin >> N; memset(dp, -1, sizeof dp); cout << dfs() << endl; }