結果
| 問題 |
No.843 Triple Primes
|
| コンテスト | |
| ユーザー |
zerotwo-cp
|
| 提出日時 | 2025-02-11 19:17:44 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 81 ms / 2,000 ms |
| コード長 | 7,280 bytes |
| コンパイル時間 | 5,646 ms |
| コンパイル使用メモリ | 331,948 KB |
| 実行使用メモリ | 5,632 KB |
| 最終ジャッジ日時 | 2025-02-11 19:17:54 |
| 合計ジャッジ時間 | 8,615 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 42 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
namespace cpstd {
static constexpr const int BUF_SIZE = 1 << 20;
class Cinstream {
private:
unsigned int p = BUF_SIZE;
static char Q[BUF_SIZE];
public:
char seekchar() {
if (p == BUF_SIZE) {
size_t len = fread(Q, 1, BUF_SIZE, stdin);
if (len != BUF_SIZE) Q[len] = '\0';
p = 0;
}
return Q[p];
}
void skipspace() {
while (isspace(seekchar())) ++p;
}
uint32_t nextu32() {
skipspace();
uint32_t res = 0;
while (true) {
char tmp = seekchar();
if ('9' < tmp || tmp < '0') break;
res = res * 10 + (tmp - '0');
++p;
}
return res;
}
int32_t nexti32() {
skipspace();
if (seekchar() == '-') {
++p;
return (int32_t)(-nextu32());
}
return (int32_t)nextu32();
}
uint64_t nextu64() {
skipspace();
uint64_t res = 0;
while (true) {
char tmp = seekchar();
if ('9' < tmp || tmp < '0') break;
res = res * 10 + (tmp - '0');
++p;
}
return res;
}
int64_t nexti64() {
skipspace();
if (seekchar() == '-') {
++p;
return (int64_t)(-nextu64());
}
return (int64_t)nextu64();
}
char nextchar() {
skipspace();
char res = seekchar();
++p;
return res;
}
std::string nexttoken() {
skipspace();
std::string res;
while (true) {
char ch = seekchar();
if (isspace(ch) || ch == '\0') break;
res.push_back(ch);
++p;
}
return res;
}
Cinstream& operator>>(unsigned int& dest) {
dest = nextu32();
return *this;
}
Cinstream& operator>>(int& dest) {
dest = nexti32();
return *this;
}
Cinstream& operator>>(unsigned long& dest) {
dest = nextu64();
return *this;
}
Cinstream& operator>>(long& dest) {
dest = nexti64();
return *this;
}
Cinstream& operator>>(unsigned long long& dest) {
dest = nextu64();
return *this;
}
Cinstream& operator>>(long long& dest) {
dest = nexti64();
return *this;
}
Cinstream& operator>>(std::string& dest) {
dest = nexttoken();
return *this;
}
Cinstream& operator>>(char& dest) {
dest = nextchar();
return *this;
}
template <typename T>
Cinstream& operator>>(std::vector<T>& dest) {
for (T& e : dest) (*this) >> e;
return *this;
}
template <
typename T,
typename U
>
Cinstream& operator>>(std::pair<T, U>& dest) {
(*this) >> dest.first >> dest.second;
return *this;
}
} Cin;
struct FastOutputTable {
public:
char LZ[1000][4] = {}, NLZ[1000][4] = {};
constexpr FastOutputTable() {
using u32 = uint_fast32_t;
for (u32 d = 0; d < 1000; ++d) {
LZ[d][0] = ('0' + d / 100 % 10);
LZ[d][1] = ('0' + d / 10 % 10);
LZ[d][2] = ('0' + d % 10);
LZ[d][3] = '\0';
}
for (u32 d = 0, i = 0; d < 1000; ++d, i = 0) {
if (d >= 100) NLZ[d][i++] = ('0' + d / 100 % 10);
if (d >= 10) NLZ[d][i++] = ('0' + d / 10 % 10);
if (d >= 1) NLZ[d][i++] = ('0' + d % 10);
NLZ[d][i++] = '\0';
}
}
};
class Coutstream {
private:
using u32 = uint32_t;
using u64 = uint64_t;
static char Q[BUF_SIZE];
static inline constexpr FastOutputTable TB = FastOutputTable();
u32 p = 0;
static constexpr u32 P10[] = {
1UL,
10UL,
100UL,
1000UL,
10000UL,
100000UL,
1000000UL,
10000000UL,
100000000UL,
1000000000UL,
};
static constexpr u64 P10L[] = {
1ULL,
10ULL,
100ULL,
1000ULL,
10000ULL,
100000ULL,
1000000ULL,
10000000ULL,
100000000ULL,
1000000000ULL,
10000000000ULL,
100000000000ULL,
1000000000000ULL,
10000000000000ULL,
100000000000000ULL,
1000000000000000ULL,
10000000000000000ULL,
100000000000000000ULL,
1000000000000000000ULL
};
template <typename T, typename U>
static void fil(T& m, U& l, U x) noexcept {
m = l / x;
l -= m * x;
}
void next_dig9(u32 x) {
u32 y;
fil(y, x, P10[6]);
nextcstr(TB.LZ[y]);
fil(y, x, P10[3]);
nextcstr(TB.LZ[y]);
nextcstr(TB.LZ[x]);
}
public:
void nextchar(char c) {
Q[p++] = c;
if (p == BUF_SIZE) {
fwrite(Q, p, 1, stdout);
p = 0;
}
}
void nexteoln() {
nextchar('\n');
}
void nextcstr(const char *s) {
while (*s) nextchar(*(s++));
}
void nextu32(uint32_t x) {
u32 y = 0;
if (x >= P10[9]) {
fil(y, x, P10[9]);
nextcstr(TB.NLZ[y]);
next_dig9(x);
}
else if (x >= P10[6]) {
fil(y, x, P10[6]);
nextcstr(TB.NLZ[y]);
fil(y, x, P10[3]);
nextcstr(TB.LZ[y]);
nextcstr(TB.LZ[x]);
}
else if (x >= P10[3]) {
fil(y, x, P10[3]);
nextcstr(TB.NLZ[y]);
nextcstr(TB.LZ[x]);
}
else if (x >= 1) nextcstr(TB.NLZ[x]);
else nextchar('0');
}
void nexti32(int32_t x) {
if (x >= 0) nextu32(x);
else {
nextchar('-');
nextu32((u32)-x);
}
}
void nextu64(uint64_t x) {
u32 y = 0;
if (x >= P10L[18]) {
fil(y, x, P10L[18]);
nextu32(y);
fil(y, x, P10L[9]);
next_dig9(y);
next_dig9(x);
}
else if (x >= P10L[9]) {
fil(y, x, P10L[9]);
nextu32(y);
next_dig9(x);
}
else nextu32(x);
}
void nexti64(int64_t x) {
if (x >= 0) nextu64(x);
else {
nextchar('-');
nextu64((u64)-x);
}
}
void writetofile(bool flush = false) {
fwrite(Q, p, 1, stdout);
if (flush) fflush(stdout);
p = 0;
}
Coutstream() { Q[0] = 0; }
~Coutstream() { writetofile(); }
Coutstream& operator<<(unsigned int tg) {
nextu32(tg);
return *this;
}
Coutstream& operator<<(unsigned long tg) {
nextu64(tg);
return *this;
}
Coutstream& operator<<(unsigned long long tg) {
nextu64(tg);
return *this;
}
Coutstream& operator<<(int tg) {
nexti32(tg);
return *this;
}
Coutstream& operator<<(long tg) {
nexti64(tg);
return *this;
}
Coutstream& operator<<(long long tg) {
nexti64(tg);
return *this;
}
Coutstream& operator<<(const std::string& tg) {
nextcstr(tg.c_str());
return *this;
}
Coutstream& operator<<(const char *tg) {
nextcstr(tg);
return *this;
}
Coutstream& operator<<(char tg) {
nextchar(tg);
return *this;
}
template <typename T>
Coutstream& operator<<(std::vector<T>& tg) {
for (int i = 0; i < (int)tg.size(); ++i) {
if (i > 0) nextchar(' ');
(*this) << tg[i];
}
return *this;
}
template <
typename T,
typename U
>
Coutstream& operator<<(std::pair<T, U>& tg) {
(*this) << tg.first << ' ' << tg.second;
return *this;
}
} Cout;
char Cinstream::Q[BUF_SIZE], Coutstream::Q[BUF_SIZE];
std::vector<int> LinearSieve(int N) {
std::vector<int> lpf(N + 1), primes;
std::iota(lpf.begin(), lpf.end(), 0);
for (int i = 2; i <= N; ++i) {
if (lpf[i] == i) primes.push_back(i);
int lpf_i = lpf[i], mini = std::min(lpf[i], N / i);
for (int j = 0; (j < (int)primes.size() && primes[j] <= mini); ++j) lpf[i * primes[j]] = primes[j];
}
return lpf;
}
void LinearSieve(int N, std::vector<int>& lpf) {
std::vector<int> primes;
std::iota(lpf.begin(), lpf.end(), 0);
for (int i = 2; i <= N; ++i) {
if (lpf[i] == i) primes.push_back(i);
int lpf_i = lpf[i], mini = std::min(lpf[i], N / i);
for (int j = 0; (j < (int)primes.size() && primes[j] <= mini); ++j) lpf[i * primes[j]] = primes[j];
}
}
}
int main() {
int N;
cpstd::Cin >> N;
auto lpf = cpstd::LinearSieve(N);
int ans = 0;
for (long long q = 2; q <= N; ++q) {
if (lpf[q] != q) continue;
for (long long r = 2; (r <= N && r * r - q <= N); ++r) {
if (r * r - q < 2 || lpf[r] != r) continue;
if (lpf[r * r - q] == r * r - q) ans++;
}
}
cpstd::Cout << ans << '\n';
return 0;
}
zerotwo-cp