๋ฌธ์
์ํํธ ์๋ ์ฑ๊ณต๋ค๊ตญ์ด
๋ฌธ์
๋๊ท๋ถ๋์ฐ์์ ์ํํธ๋ฅผ ์๋ํ๊ณ ์๋ค. ์ํํธ์ ๋ฐฉ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฉด์ ์ด 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;
}