提出 #7039762
ソースコード 拡げる
#include <bits/stdc++.h>
#define N (long long)(1e9 + 7)
#define fin 61
using namespace std;
long long l, r;
long long dp[70][2][2];
long long solve();
long long cnt(long long nowl, long long nowr,
long long dig);
bool ch(long long x, long long d);
int main() {
cin >> l >> r;
cout << solve() << endl;
return 0;
}
long long solve() {
long long ans = 0;
for(int i = 0; i < fin; ++i) {
long long nbase = 1LL << i, nmax = (1LL << (i + 1)) - 1;
if(nmax < l || nbase > r) continue;
ans +=
cnt(max(nbase, l) - nbase, min(r, nmax) - nbase, i);
ans %= N;
}
return ans;
}
long long cnt(long long nowl, long long nowr,
long long dig) {
for(int i = 0; i <= dig; ++i)
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k) dp[i][j][k] = 0;
long long ans = 0;
// i l r
dp[0][0][0] = 1;
for(int i = 0; i < dig; ++i) {
bool flagr = ch(nowr, dig - 1 - i),
flagl = ch(nowl, dig - 1 - i);
if(flagr && flagl) {
// use 1 1
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k)
dp[i + 1][j][k] = dp[i][j][k];
// use 0 1
for(int j = 0; j < 2; ++j) {
dp[i + 1][1][j] += dp[i][1][j];
dp[i + 1][1][j] %= N;
}
// use 0 0
dp[i + 1][1][1] += (dp[i][1][0] + dp[i][1][1]) % N;
dp[i + 1][1][1] %= N;
}
else if(flagr) {
// use 1 1
for(int j = 0; j < 2; ++j)
dp[i + 1][1][j] = (dp[i][0][j] + dp[i][1][j]) % N;
// use 0 1
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k) {
dp[i + 1][j][k] += dp[i][j][k];
dp[i + 1][j][k] %= N;
}
// use 0 0
for(int j = 0; j < 2; ++j) {
dp[i + 1][j][1] += (dp[i][j][1] + dp[i][j][0]) % N;
dp[i + 1][j][1] %= N;
}
}
else if(flagl) {
// use 1 1
for(int j = 0; j < 2; ++j)
dp[i + 1][j][1] = dp[i][j][1];
// use 0 1
dp[i + 1][1][1] += dp[i][1][1];
dp[i + 1][1][1] %= N;
// use 0 0
for(int j = 0; j < 2; ++j) {
dp[i + 1][1][j] += dp[i][1][j];
dp[i + 1][1][j] %= N;
}
}
else {
// use 1 1
dp[i + 1][1][1] = (dp[i][1][1] + dp[i][0][1]) % N;
// use 0 1
for(int j = 0; j < 2; ++j) {
dp[i + 1][j][1] += dp[i][j][1];
dp[i + 1][j][1] %= N;
}
// use 0 0
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k) {
dp[i + 1][j][k] += dp[i][j][k];
dp[i + 1][j][k] %= N;
}
}
}
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j) {
ans += dp[dig][i][j];
ans %= N;
}
return ans;
}
bool ch(long long x, long long d) { return (x >> d) & 1; }
提出情報
| 提出日時 | |
|---|---|
| 問題 | F - Coincidence |
| ユーザ | m_tsubasa |
| 言語 | C++14 (GCC 5.4.1) |
| 得点 | 600 |
| コード長 | 2841 Byte |
| 結果 | AC |
| 実行時間 | 1 ms |
| メモリ | 256 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 600 / 600 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 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 |