algorithm

BOJ 5615

rkawk 2024. 3. 15. 17:56

๋ฌธ์ œ

๋”๋ณด๊ธฐ

์•„ํŒŒํŠธ ์ž„๋Œ€ ์„ฑ๊ณต๋‹ค๊ตญ์–ด

๋ฌธ์ œ

๋™๊ทœ๋ถ€๋™์‚ฐ์—์„œ ์•„ํŒŒํŠธ๋ฅผ ์ž„๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค. ์•„ํŒŒํŠธ์˜ ๋ฐฉ์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ฉด์ ์ด 2xy + x + y์ด๋‹ค. (x์™€ y๋Š” ์–‘์˜ ์ •์ˆ˜)

๋™๊ทœ๋ถ€๋™์‚ฐ์˜ ์นดํƒˆ๋กœ๊ทธ์—๋Š” ์•„ํŒŒํŠธ์˜ ๋ฉด์ ์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ ํ˜€์ ธ ์žˆ์ง€๋งŒ, ์ด ์ค‘ ์ผ๋ถ€๋Š” ์žˆ์„ ์ˆ˜ ์—†๋Š” ํฌ๊ธฐ์˜ ์•„ํŒŒํŠธ์ด๋‹ค. ๋งŒ์•ฝ, ์ด๋Ÿฐ ํฌ๊ธฐ์˜ ์•„ํŒŒํŠธ๋ฅผ ์ž„๋Œ€ํ•˜๊ฒ ๋‹ค๊ณ  ๋งํ•˜๋ฉด, ๋™๊ทœ๋Š” ๊ฝ! ์ด๋ผ๊ณ  ์™ธ์น˜๋ฉด์„œ, ์ˆ˜์ˆ˜๋ฃŒ๋งŒ ๋–ผ์–ด๊ฐ„๋‹ค.

๋™๊ทœ๋ถ€๋™์‚ฐ์˜ ์นดํƒˆ๋กœ๊ทธ์— ์ ํžŒ ์•„ํŒŒํŠธ์˜ ๋ฉด์ ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์žˆ์„ ์ˆ˜ ์—†๋Š” ํฌ๊ธฐ์˜ ์•„ํŒŒํŠธ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์•„ํŒŒํŠธ์˜ ๋ฉด์ ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N๊ฐœ ์ค„์— ์นดํƒˆ๋กœ๊ทธ์— ์ ํ˜€์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ฉด์ ์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 100,000์ดํ•˜์ด๊ณ  ๋ฉด์ ์€ 231-1์ดํ•˜์ธ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์žˆ์„ ์ˆ˜ ์—†๋Š” ์•„ํŒŒํŠธ ๋ฉด์ ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

2xy + x + y  = S ๋ผ ํ–ˆ์„๋•Œ, (2x+1)(2y+1) = 2S+1๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. x, y์˜ ๋ฒ”์œ„๊ฐ€ ์–‘์˜ ์ •์ˆ˜์ด๋ฏ€๋กœ 2S+1์€ ๋ฌด์กฐ๊ฑด ํ•ฉ์„ฑ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ž…๋ ฅ๋ฐ›์€ S์— ๋Œ€ํ•ด์„œ 2S+1์ด ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ์ •๋‹ต ์นด์šดํŠธ๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

 

#include <iostream>
using namespace std;
#define ll unsigned long long 
ll N, ans;
int a_param[5] = {2, 3, 5, 7, 11};
ll power(ll x, ll y, ll mod) {
    ll result = 1;
    x %= mod;
    while(y) {
        if(y%2) result = (result*x)%mod;
        y/=2;
        x = (x*x)%mod;
    }
    return result;
}
bool miller(ll n, ll a) {
    if(a%n == 0) return false;
    ll k = n-1;
    while(1) {
        ll temp = power(a, k, n);
        if(temp == n-1) return true;
        if(k%2) return (temp == 1 || temp == -1);
        k /= 2;
    }
}

int isPrime(ll n) {
    if(n == 2 || n == 3) return true;
    if(n%2 == 0 || n == 1) return false;
    for(int i=0; i<5; i++) {
        ll a = a_param[i];
        if(a == n) return true;
        if(!miller(n, a)) return false;
    }
    return true;
}

int main() {
    cin>>N;
    while(N--) {
        ll S; cin>>S;
        if(isPrime(2*S+1)) ans += 1;
    }
    cout<<ans;
}

 

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 3197  (0) 2024.03.24
BOJ 6087  (1) 2024.03.20
BOJ 1976  (0) 2022.10.15
BOJ 17143  (1) 2022.10.13
BOJ 1445  (1) 2022.10.13