Birə Azaldın#10272

Birə Azaldın (Həll təhlili)

Əvvəlcə ifadəni çevriləmək lazımdır:

x + y + x \cdot y = y \cdot (x + 1) + (x + 1) - 1 = (x + 1) \cdot (y + 1) - 1

İndi əməliyyat iki sayının artırılması və sonrasında çıxılması kimi görünür.

Siyahıdan və ədədini çıxaraq. Beləliklə, siyahıya daxil ediləcək ədəd

(x + 1) \cdot (y + 1) - 1

Sonra siyahıdan (x + 1) \cdot (y + 1) - 1 və ədədini çıxaraq. Beləliklə, siyahıya daxil ediləcək ədəd olacaq

((x + 1) \cdot (y + 1) - 1 + 1) \cdot (z + 1) - 1 = (x + 1) \cdot (y + 1) \cdot (z + 1) - 1

Bu analoquya əsaslanaraq, deyə bilərik ki, əgər əvvəlcə

L = {a_1, a_2, ..., a_n},

sonda hesablama nəticəsi

(a_1 + 1) \cdot (a_2 + 1) \cdot ... \cdot (a_n + 1) - 1

Ilk siyahı bütün tam ədədləri -dən -ə qədər əhatə etdiyindən, son nəticədə

(1 + 1) \cdot (2 + 1) \cdot ... \cdot (n + 1) – 1 = (n + 1)! - 1

Sonuç ədəd tam olaraq müəyyən edilir və əməliyyatların sıralanmasından asılı deyildir.

Alqoritmin Tətbiqi

Sabitləri elan edək.

#define MOD 1000000007
#define MAX 1000002

Girdilər bir neçə testdən ibarətdir. massivini elan edək, belə ki, p[i] = i! olsun.

long long p[MAX];

Test sayını oxuyuruq. Sayların faktoriallarını hesablayıb massiyə yığırıq: p[i] = i!.

scanf("%d", &tests);
p[1] = 1;
for (i = 2; i < MAX; i++)
  p[i] = (p[i - 1] * i) % MOD;

Testləri ardıcıl emal edirik.

while (tests--)
{

Hər bir girdidə üçün cavabı çıxış - (n + 1)! - 1 hesablaıntısı.

  scanf("%d", &n);
  printf("%lld\n", p[n + 1] - 1);
}

Python Tətbiqi

Sabitləri elan edək.

MOD = 1000000007
MAX = 1000002

Sayların faktoriallarını hesablayıb siyahıda saxlayırıq: p[i] = i!

p = [1] * MAX
for i in range(2, MAX):
  p[i] = (p[i - 1] * i) % MOD

Test sayını oxuyuruq.

tests = int(input())

Testləri ardıcıl emal edirik.

for _ in range(tests):

Hər bir girdidə üçün cavabı çıxış - (n + 1)! - 1 hesablaıntısı.

  n = int(input())
  print(p[n + 1] - 1)