結果
問題 | No.2972 確率的素数判定 |
ユーザー |
![]() |
提出日時 | 2024-11-29 21:41:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 99 ms / 2,000 ms |
コード長 | 2,232 bytes |
コンパイル時間 | 1,993 ms |
コンパイル使用メモリ | 197,744 KB |
最終ジャッジ日時 | 2025-02-26 09:15:20 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
//#pragma GCC target("avx2")//#pragma GCC optimize("O3")//#pragma GCC optimize("unroll-loops")#include <bits/stdc++.h>using namespace std;using ll = long long;using pii = pair<int,int>;using pll = pair<ll,ll>;using pli = pair<ll,int>;#define TEST cerr << "TEST" << endl#define AMARI 998244353//#define AMARI 1000000007#define el '\n'#define El '\n'#define SIZE 100010vector<bool> prime(SIZE);vector<int> prime_ruiseki(SIZE);#define MULTI_TEST_CASE truevoid solve(void){//問題を見たらまず「この問題設定から言えること」をいっぱい言う//一個回答に繋がりそうな解法が見えても、実装や細かい詰めに時間がかかりそうなら別の方針を考えてみる//添え字回りで面倒になりそうなときは楽になる言い換えを実装の前にじっくり考える//ある程度考察しても全然取っ掛かりが見えないときは実験をしてみる//よりシンプルな問題に言い換えられたら、言い換えた先の問題を自然言語ではっきりと書くint n;cin >> n;long double p,q;cin >> p >> q;p /= 1000;q = 100 - q;q /= 1000;long double ans = 0;//素数を受け取った確率long double val1 = (long double)prime_ruiseki[n] / (long double)n * (long double)p;//素数でない数を受け取った確率long double val2 = (long double)(n - prime_ruiseki[n]) / (long double)n * (long double)(q);ans = val1 / (val1 + val2);cout << fixed << setprecision(15);cout << ans << el;return;}void calc(void){for(int i = 0; i < SIZE; i++){prime[i] = true;prime_ruiseki[i] = 0;}prime[0] = prime[1] = false;for(int i = 2; i < SIZE; i++){if(!prime[i])continue;for(int j = i + i; j < SIZE; j += i){prime[j] = false;}}for(int i = 2; i < SIZE; i++){prime_ruiseki[i] = prime_ruiseki[i - 1] + (prime[i] ? 1 : 0);}return;}signed main(void){cin.tie(nullptr);ios::sync_with_stdio(false);calc();int t = 1;if(MULTI_TEST_CASE)cin >> t;while(t--){solve();}return 0;}