結果
| 問題 | No.3296 81-like number | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-08-19 02:22:44 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 3 ms / 2,000 ms | 
| コード長 | 1,354 bytes | 
| コンパイル時間 | 1,934 ms | 
| コンパイル使用メモリ | 204,704 KB | 
| 実行使用メモリ | 7,716 KB | 
| 最終ジャッジ日時 | 2025-08-19 02:22:48 | 
| 合計ジャッジ時間 | 3,281 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 15 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct PrimeSieve{
    int n, half;
    std::vector<bool> sieve;
    std::vector<T> prime_list;
    // sieve[i] ... 2 * i + 1
    PrimeSieve(T _n) : n(_n){
        init();
    }
    void init(){
        if(n < 2){
            return;
        }
        half = (n + 1) / 2;
        sieve.assign(half, true);
        sieve[0] = false;
        prime_list.emplace_back(2);
        for(long long i = 1; 2 * i + 1 <= n; ++i){
            if(!sieve[i]) continue;
            T p = 2 * i + 1;
            prime_list.emplace_back(p);
            for(long long j = 2 * i * (i + 1); j < half; j += p){
                sieve[j] = false;
            }
        }
    }
    bool isPrime(T x){
        if(x == 2) return true;
        if(x % 2 == 0) return false;
        return sieve[x / 2];
    }
    T getPrimeCount(){
        return prime_list.size();
    }
    T getKthPrime(int k){
        return prime_list[k];
    }
};
int main(){
    long long n; cin >> n;
    assert(2LL <= n && n <= 10000000000LL);
    const int MAX_SQRT = 100000;
    PrimeSieve<int> ps(MAX_SQRT);
    long long ans = 0;
    for(long long i = 2; i * i <= n; i++){
        if(!ps.isPrime(i)) continue;
        for(long long j = i * i; j <= n; j *= i){
            ans += j;
        }
    }
    cout << ans << endl;
}
            
            
            
        