Submission #8296191
Source Code Expand
#include <bits/stdc++.h>
#define GET_REP(_1, _2, _3, NAME, ...) NAME
#define rep(...) GET_REP(__VA_ARGS__, irep, _rep)(__VA_ARGS__)
#define rep1(...) GET_REP(__VA_ARGS__, irep1, _rep1)(__VA_ARGS__)
#define _rep(i, n) irep (i, 0, n)
#define _rep1(i, n) irep1(i, 1, n)
#define irep(i, a, n) for (int i = a; i < (int)(n); ++i)
#define irep1(i, a, n) for (int i = a; i <= (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep1(i, n) for (int i = (int)(n); i >= 1; --i)
#define allrep(X, x) for (auto &&X : x)
#define all(x) (x).begin(), (x).end()
#ifdef LOCAL
#include "../../Lib/cout_container.hpp"
#define debug(x) cerr << #x " => " << (x) << endl
#else
#define debug(x) 0
#endif
using lint = long long;
constexpr int INF = 1 << 29;
constexpr lint INFL = 1LL << 61;
constexpr int MOD = (int)1e9 + 7;
constexpr double EPS = 1e-9;
using namespace std;
namespace { struct INIT { INIT() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(15); } } INIT; }
template <long long mod_num>
class ModInt {
long long n_;
public:
constexpr ModInt(const long long num = 0) : n_(num % mod_num) {}
constexpr const long long&value() const { return n_; }
constexpr bool operator==(const ModInt &r) const { return this->n_ == r.n_; }
constexpr bool operator==(const long long &r) const { return this->n_ == r; }
constexpr bool operator!=(const ModInt &r) const { return this->n_ != r.n_; }
constexpr bool operator!=(const long long &r) const { return this->n_ != r; }
constexpr bool operator<(const ModInt &r) const { return this->n_ < r.n_; }
constexpr bool operator<(const long long &r) const { return this->n_ < r; }
constexpr bool operator>(const ModInt &r) const { return this->n_ > r.n_; }
constexpr bool operator>(const long long &r) const { return this->n_ > r; }
constexpr bool operator<=(const ModInt &r) const { return this->n_ <= r.n_; }
constexpr bool operator<=(const long long &r) const { return this->n_ <= r; }
constexpr bool operator>=(const ModInt &r) const { return this->n_ >= r.n_; }
constexpr bool operator>=(const long long &r) const { return this->n_ >= r; }
constexpr ModInt operator+(const ModInt &r) const { return ModInt(*this) += r; }
constexpr ModInt operator-(const ModInt &r) const { return ModInt(*this) -= r; }
constexpr ModInt operator*(const ModInt &r) const { return ModInt(*this) *= r; }
constexpr ModInt operator/(const ModInt &r) const { return ModInt(*this) /= r; }
constexpr ModInt operator+(const long long &r) const { return ModInt(*this) += ModInt(r); }
constexpr ModInt operator-(const long long &r) const { return ModInt(*this) -= ModInt(r); }
constexpr ModInt operator*(const long long &r) const { return ModInt(*this) *= ModInt(r); }
constexpr ModInt operator/(const long long &r) const { return ModInt(*this) /= ModInt(r); }
friend ModInt operator+(const long long &l, const ModInt &r) { return ModInt(l) += r; }
friend ModInt operator-(const long long &l, const ModInt &r) { return ModInt(l) -= r; }
friend ModInt operator*(const long long &l, const ModInt &r) { return ModInt(l) *= r; }
friend ModInt operator/(const long long &l, const ModInt &r) { return ModInt(l) /= r; }
constexpr ModInt &operator++() { return *this += 1; }
constexpr ModInt &operator--() { return *this -= 1; }
constexpr ModInt &operator+=(const ModInt &r) {
n_ += r.n_;
if (n_ >= mod_num) n_ -= mod_num;
return *this;
}
constexpr ModInt &operator-=(const ModInt &r) {
if (n_ < r.n_) n_ += mod_num;
n_ -= r.n_;
return *this;
}
constexpr ModInt &operator*=(const ModInt &r) {
n_ = n_ * r.n_ % mod_num;
return *this;
}
constexpr ModInt &operator/=(ModInt r) {
long long exp = mod_num - 2;
while (exp) {
if (exp & 2) *this *= r;
r *= r;
exp /= 2;
}
return *this;
}
friend istream &operator>>(istream &is, ModInt<mod_num> &r) {
is >> r.n_;
r.n_ %= r.mod_num;
return is;
}
friend ostream &operator<<(ostream &os, const ModInt<mod_num> &r) { return os << r.n_; }
explicit operator int() const { return n_; }
explicit operator long long() const { return n_; }
explicit operator double() const { return n_; }
};
bool check(const lint n, const int dig) { return n & (1LL << (59 - dig)); }
using mint = ModInt<MOD>;
int main(void) {
lint l, r;
cin >> l >> r;
vector<vector<vector<vector<mint>>>> dp(61, vector<vector<vector<mint>>>(2, vector<vector<mint>>(2, vector<mint>(2))));
// 60桁目(0-index)以上が1の数は必ずRより大きくなってしまうので0のみから成る1通りのみ
dp[0][0][0][0] = 1;
rep (d, 60) {
bool cl = check(l, d), cr = check(r, d);
rep (i, 2) {
rep (j, 2) {
rep (k, 2) {
auto val = dp[d][i][j][k];
rep (x, 2) {
rep (y, 2) {
// 条件に当てはまるかチェック
// xの方が大きい
if (x && !y) continue;
// 最上位ビットが異なる
if (!k && (x ^ y)) continue;
// L以上が未確定な状態でLよりも小さい
if (!i && cl && (!x || !y)) continue;
// R以下が未確定な状態でRよりも大きい
if (!j && !cr && (x || y)) continue;
//
// 遷移先が変わるかチェック
int ni = i, nj = j, nk = k;
// L以上が確定
if (!cl && x) ni = 1;
// R以下が確定
if (cr && !y) nj = 1;
// 最上位ビットが確定
if (!k && x) nk = 1;
//
// 遷移
dp[d + 1][ni][nj][nk] += val;
}
}
}
}
}
}
mint ans = 0;
rep (i, 2) {
rep (j, 2) {
rep (k, 2) {
ans += dp[60][i][j][k];
}
}
}
cout << ans << endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
F - Coincidence |
| User |
icia |
| Language |
C++14 (GCC 5.4.1) |
| Score |
600 |
| Code Size |
6125 Byte |
| Status |
AC |
| Exec Time |
1 ms |
| Memory |
256 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
a01, a02, a03 |
| All |
a01, a02, a03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23 |
| Case Name |
Status |
Exec Time |
Memory |
| a01 |
AC |
1 ms |
256 KiB |
| a02 |
AC |
1 ms |
256 KiB |
| a03 |
AC |
1 ms |
256 KiB |
| b04 |
AC |
1 ms |
256 KiB |
| b05 |
AC |
1 ms |
256 KiB |
| b06 |
AC |
1 ms |
256 KiB |
| b07 |
AC |
1 ms |
256 KiB |
| b08 |
AC |
1 ms |
256 KiB |
| b09 |
AC |
1 ms |
256 KiB |
| b10 |
AC |
1 ms |
256 KiB |
| b11 |
AC |
1 ms |
256 KiB |
| b12 |
AC |
1 ms |
256 KiB |
| b13 |
AC |
1 ms |
256 KiB |
| b14 |
AC |
1 ms |
256 KiB |
| b15 |
AC |
1 ms |
256 KiB |
| b16 |
AC |
1 ms |
256 KiB |
| b17 |
AC |
1 ms |
256 KiB |
| b18 |
AC |
1 ms |
256 KiB |
| b19 |
AC |
1 ms |
256 KiB |
| b20 |
AC |
1 ms |
256 KiB |
| b21 |
AC |
1 ms |
256 KiB |
| b22 |
AC |
1 ms |
256 KiB |
| b23 |
AC |
1 ms |
256 KiB |