Kök, logaritm, sinus#1207

Kök, logaritm, sinus (Həll təhlili)

x_i dəyərini funksiyası vasitəsilə hesablayacağıq. Bunun üçün təkrarlanma relasiyasını həyata keçirmək lazımdır

f(i) = f(\lfloor i - \sqrt{i} \rfloor) + f(\lfloor ln(i) \rfloor) + f(\lfloor i \cdot sin^2(i) \rfloor)
f(0) = 1

dəyərlərini 10^6 ölçülü xətti massivdə yadda saxlamağa görə.

Alqoritmin həyata keçirilməsi

x_i dəyərləri massivində saxlanılacaq.

#define MAX 1000001
int dp[MAX];

funksiyası x_n dəyərini hesablayır.

int f(int n)
{

Rekursiyanın bitmə şərti.

  if (n == 0) return 1;

Əgər x_n dəyəri artıq hesablanmışdırsa ( dp [n] \ne -1 ), geri qaytarırıq.

  if (dp[n] != -1) return dp[n];

Birinci, ikinci və üçüncü termləri rekursiv şəkildə hesablayırıq.

  int a = f((int)(n - sqrt(n)));
  int b = f((int)(log(n)));
  int c = f((int)(n * sin(n) * sin(n)));

x_n dəyərini hesablayır, yadda saxlayır və geri qaytarırıq.

  return dp[n] = (a + b + c) % 1000000;
}

Proqramın əsas hissəsi. x_i dəyəri hələ hesablanmayıbsa dp[i] = -1 qəbul edək.

memset(dp,-1,sizeof(dp));

Bir neçə testi işləyirik. Hər bir dəyəri üçün cavabı göstəririk.

while(scanf("%d",&n), n != -1)
  printf("%d\n",f(n));

Alqoritmin həyata keçirilməsi — rekursiv olmayan

x_i dəyərləri massivində saxlanılacaq.

int x[1000001];

massivinin elementlərini verilmiş təkrarlanma relasiyası ilə doldururuq.

x[0] = 1;
for (i = 1; i <= 1000000; i++)
  x[i] = (x[(int)(i - sqrt(i))] + x[(int)(log(i))] +
          x[(int)(i * sin(i) * sin(i))]) % 1000000;

Bir neçə testi işləyirik. Hər bir dəyəri üçün cavabı göstəririk.

while (scanf("%d", &n), n != -1)
  printf("%d\n", x[n]);

Java ilə həyata keçirilməsi

import java.util.*;

public class Main
{
  static int dp[] = new int[1000001];

  static int f(int n)
  {
    if (n == 0) return 1;
    if (dp[n] != -1) return dp[n];
    
    int a = f((int)(n - Math.sqrt(n)));
    int b = f((int)(Math.log(n)));
    int c = f((int)(n * Math.sin(n) * Math.sin(n)));
    return dp[n] = (a + b + c) % 1000000;
  }
  
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    Arrays.fill(dp, -1);
    while(true)
    {
      int n = con.nextInt();
      if (n == -1) break;
      System.out.println(f(n));
    }
    con.close();
  }
}

Python ilə həyata keçirilməsi

import math

massivini inizializasiya edirik.

x = [0] * 1000001
x[0] = 1

massivinin elementlərini verilmiş təkrarlanma relasiyası ilə doldururuq.

for i in range(1, 1000001):
  x[i] = (x[int(i - math.sqrt(i))] +
          x[int(math.log(i))] +
          x[int(i * math.sin(i)**2)]) % 1000000

Bir neçə testi işləyirik. Hər bir dəyəri üçün cavabı göstəririk.

while True:
  n = int(input())
  if n == -1:
    break
  print(x[n])