YAPTCHA#5730

YAPTCHA (Həll təhlili)

Tutaq ki, m = 3k + 7. Onda tələb olunan ifadə aşağıdakı kimi yenidən yazıla bilər:

S_n = \sum_{m = 10, m = 1~(mod~3)}^{3n + 7} \left\lfloor \frac{(m - 1)! + 1}{m} - \left\lfloor \frac{(m - 1)!}{m} \right\rfloor \right\rfloor,

Vilson teoremi. Əgər sadə ədəddirsə, onda

(m - 1)! = -1~(mod~m)

Yəni

(m - 1)! + 1 = 0~(mod~m)

Buna görə də, əgər sadə ədəddirsə, onda \frac{(m-1)!+1}{m} tam ədəd olacaq.

Eyni zamanda

\left\lfloor \frac{(m-1)!}{m} \right\rfloor = \left\lfloor \frac{(m - 1)! + 1}{m} - \frac{1}{m} \right\rfloor = \frac{(m - 1)! + 1}{m} - 1

Onda bütün ifadə bərabərdir

\left\lfloor \frac{(m - 1)! + 1}{m} - \left\lfloor \frac{(m - 1)!}{m} \right\rfloor \right\rfloor = \frac{(m - 1)! + 1}{m} - \left( \frac{(m - 1)! + 1}{m} - 1 \right) = 1

Əgər tərkib ədəddirsə, onda

(m - 1)! = 0~(mod~m),

çünki soldakı vurğunlar arasında ədədinin bütün bölənləri mövcuddur.

Bu halda

\frac{(m-1)!}{m}

ifadəsi tam olacaq.

Onda bütün ifadə bərabərdir

\left\lfloor \frac{(m - 1)! + 1}{m} - \left\lfloor \frac{(m - 1)!}{m} \right\rfloor \right\rfloor = \left\lfloor \frac{(m - 1)!}{m} + \frac{1}{m} - \frac{(m - 1)!}{m} \right\rfloor = \left\lfloor \frac{1}{m} \right\rfloor = 0

S_n-i hesablamaq üçün 1 \le k \le n şərtini ödəyən 3k + 7 formasında olan sadə ədədlərin sayını tapmaq kifayətdir.

Eratosthenes süzgəci vasitəsilə adlı bir massiv qururuq, burada:

used[i] = \begin{cases} 1, & \text{əgər } i \text{ sadə ədəddirsə}, \\ 0, & \text{əgər } i \text{ tərkib ədəddirsə}. \end{cases}

Daha sonra massivindən istifadə edərək 3i + 7 formasında olan sadə ədədləri təmsil edən massivini qururuq:

a[i] = \begin{cases} 1, & \text{əgər } 3i + 7 \text{ sadə ədəddirsə}, \\ 0, & \text{əgər } 3i + 7 \text{ tərkib ədəddirsə}. \end{cases}

İndi

S_n = a[1] + a[2] + … + a[n]

Çoxlu testlər olduğuna görə, onlara sabit vaxtda cavab vermək üçün prefiks cəmləri qururuq:

p[i] = a[1] + a[2] + … + a[i]

İndi hər dəyəri üçün sadəcə -i çıxarmalıyıq.

Nümunə

Tutaq ki, m = 7 — sadə. Onda

\left\lfloor \frac{6!+1}{7} - \left\lfloor \frac{6!}{7} \right\rfloor \right\rfloor = \left\lfloor \frac{721}{7} - \left\lfloor \frac{720}{7} \right\rfloor \right\rfloor = \left\lfloor 103 - \left\lfloor 102 \frac{6}{7} \right\rfloor \right\rfloor = \left\lfloor 103 - 102 \right\rfloor = 1

Tutaq ki, m = 6 — tərkib. Onda

\left\lfloor \frac{5!+1}{6} - \left\lfloor \frac{5!}{6} \right\rfloor \right\rfloor = \left\lfloor \frac{121}{6} - \left\lfloor \frac{120}{6} \right\rfloor \right\rfloor = \left\lfloor 20 + \frac{1}{6} - 20 \right\rfloor = \left\lfloor \frac{1}{6} \right\rfloor = 0

n = 10 üçün cavabı hesablayın. 3k + 7 formasında olan bütün ədədləri nəzərdən keçirək, burada 1 \le k \le 10. Onlar arasında sadə ədədləri seçin.

Göstərilən ədədlər arasında sadə ədəd var: və . Deməli, S_{10} = 4.

Alqoritmin implementasiyası

İş massivlərini elan edək. Çünki n \le 10^6, massivlərin ölçüsünü 3n + 7 = 3 \cdot 10^6 + 7 olaraq təyin etmək lazımdır.

#define MAX 3000010
char used[MAX], a[MAX];

Init funksiyası Eratosthenes süzgəcini həyata keçirir. massivi sadə ədədlər haqqında məlumatları saxlayır:

used[i] = \begin{cases} 1, & \text{əgər } i \text{ sadə ədəddirsə}, \\ 0, & \text{əgər } i \text{ tərkib ədəddirsə}. \end{cases}

massivi 3i + 7 formasında olan sadə ədədləri saxlayır:

a[i] = \begin{cases} 1, & \text{əgər } 3i + 7 \text{ sadə ədəddirsə}, \\ 0, & \text{əgər } 3i + 7 \text{ tərkib ədəddirsə}. \end{cases}
void Init()
{
  for (int i = 2; i < MAX; i++)
  {
    if (!used[i])
    {
      if ((i - 7) % 3 == 0)
        a[(i - 7) / 3] = true;
      if (i < sqrt(MAX))
        for (int j = i * i; j < MAX; j += i)
          used[j] = true;
    }
  }
}

Proqramın əsas hissəsi. Massivləri doldururuq.

Init();

massivi üçün prefiks cəmlərini hesablamaq:

p[i] = a_1 + a_2 + ... + a_i
for (int i = 2; i < MAX; ++i)
  p[i] = p[i - 1] + a[i];

sayda testləri ardıcıl işləyirik.

scanf("%d", &tests);
while (tests--)
{
  scanf("%d", &n);

Hər dəyəri üçün -i çıxarırıq.

  printf("%d\n", p[n]);
}