3785 - AI: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
Al Bundy a plecat la serviciu, lăsându-i soţiei lui, Peg, cardul de cumpărături. PIN-ul este valoarea expresiei E(n)=∑nk=1(2⋅(a2+b2)k2⋅cos(k⋅α)),  
Al Bundy a plecat la serviciu, lăsându-i soţiei lui, Peg, cardul de cumpărături. PIN-ul este valoarea expresiei E(n)=∑nk=1(2⋅(a2+b2)k2⋅cos(k⋅α)),  
unde  α=arctg(ab) , iar n, a, b sunt numere naturale nenule.
unde  α=arctg(ab) , iar n, a, b sunt numere naturale nenule.
== Cerința ==
Să se afle valoarea expresiei E(n), modulo 1.000.000.007.
== Date de intrare ==
Fișierul de intrare alin.txt conține pe prima linie numerele n, a, b, separate prin spațiu.
== Date de ieșire ==
Fișierul de ieșire alout.txt va conține pe prima linie valoarea expresiei E(n), modulo 1.000.000.007.
== Restricții și precizări ==
*1 ≤ n ≤ 10(12)
*1 ≤ a , b ≤ 20
== Exemplul 1 ==
; alin.txt
:3 5 12
; alout.txt
:1918
<br>
== Exemplul 2 ==
; alin.txt
:10 5 8
; alout.txt
:765450729
<br>
== Rezolvare ==
<syntaxhighlight lang="python" line>
#3785 - AI
import math


def calculate_expression(n, a, b):
= Cerința =
    alpha = math.atan(a * b)
Să se afle valoarea expresiei , modulo <code>1.000.000.007</code>.
    result = 0


    for k in range(1, n + 1):
= Date de intrare =
        term = (2 * (a**2 + b**2) * k**2 * math.cos(k * alpha)) % 1000000007
Fișierul de intrare <code>alIN.txt</code> conține pe prima linie numerele <code>n, a, b</code>, separate prin spațiu.
        result = (result + term) % 1000000007


    return result
= Date de ieșire =
def verificare_restrictii(n, a, b): 
Fișierul de ieșire <code>alOUT.txt</code> va conține pe prima linie valoarea expresiei , modulo <code>1.000.000.007</code>. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
    if 1 <= n <=  10**12
      1 <= a, b <= 20: 
        return True
    else:
        return False


if __name__ == "__main__":
= Restricții și precizări =
    with open("alin.txt", "r") as input_file, open("alout.txt", "w") as output_file:
        n, a, b = map(int, input_file.readline().split())
        result = calculate_expression(n, a, b)
        output_file.write(str(result) + "\n")


* <code>1 ≤ n ≤ 1012</code>
* <code>1 ≤ a , b ≤ 20</code>


</syntaxhighlight>
= Exemplul 1: =
<code>alIN.txt</code>
3 5 12
<code>alOUT.txt</code>
1918


== Explicatie ==
== Explicatie ==
Dacă α=arctg(5/12), atunci sin(α)=5/13 şi cos(α)=12/13.
Dacă α=arctg(5/12), atunci sin(α)=5/13 şi cos(α)=12/13.
Avem E(3)=2⋅13⋅cos(α)+2⋅13*2⋅cos(2α)+2⋅13*3⋅cos(3α)=2⋅13⋅12/13+2⋅13*2⋅(2⋅cos2(α)−1)+2⋅13*3⋅(4⋅cos*3(α)−3⋅cos(α))=24+238+1656=1918.
Avem E(3)=2⋅13⋅cos(α)+2⋅13*2⋅cos(2α)+2⋅13*3⋅cos(3α)=2⋅13⋅12/13+2⋅13*2⋅(2⋅cos2(α)−1)+2⋅13*3⋅(4⋅cos*3(α)−3⋅cos(α))=24+238+1656=1918.
== Exemplul 2: ==
<code>alIN.txt</code>
3 21 12
<code>alOUT.txt</code>
Datele nu corespund restrictiilor impuse
== Rezolvare ==
<syntaxhighlight lang="python" line="1">
MOD = 1000000007
def gcd(a, b):
    if b == 0:
        return (1, 0)
    else:
        x, y = gcd(b, a % b)
        return (y, x - y * (a // b))
def prod(x, y):
    ret = [[0, 0], [0, 0]]
    ret[0][0] = (x[0][0] * y[0][0] + x[0][1] * y[1][0]) % MOD
    ret[0][1] = (x[0][0] * y[0][1] + x[0][1] * y[1][1]) % MOD
    ret[1][0] = (x[1][0] * y[0][0] + x[1][1] * y[1][0]) % MOD
    ret[1][1] = (x[1][0] * y[0][1] + x[1][1] * y[1][1]) % MOD
    return ret
def pwr(mat, n):
    nullMat = [[1, 0], [0, 1]]
    if n == 0:
        return nullMat
    if n % 2:
        return prod(mat, pwr(prod(mat, mat), n // 2))
    return pwr(prod(mat, mat), n // 2)
def verify_restrictions(n, a, b):
    if 1 <= n <= 1012 and 1 <= a <= 20 and 1 <= b <= 20:
        return True
    return False
def main():
    try:
        with open("alIN.txt", "r") as fin:
            line = fin.readline().strip()
            if not line:
                raise ValueError("File is empty or invalid format.")
            n, a, b = map(int, line.split())
        if not verify_restrictions(n, a, b):
            with open("alOUT.txt", "w") as fout:
                fout.write("Datele nu corespund restrictiilor impuse")
            return
        if n == 1:
            E = ((a * a + b * b) * (2 * b - 2) - 2 * (b * b - a * a) + 2 * b) // (a * a + b * b - 2 * b + 1)
            with open("alOUT.txt", "w") as fout:
                fout.write(str(E))
            return
        numi = (b - 1) ** 2 + a * a
        pat = a * a + b * b
        invm, ins = gcd(numi, MOD)
        initMat = [[2 * b, -pat], [1, 0]]
        Alt = [[2 * (b * b - a * a), 0], [2 * b, 0]]
        C = pwr(initMat, n - 1)
        sol = prod(C, Alt)
        En = -2 * pat + 2 * b
        E = (pat * sol[1][0] - sol[0][0] + En) % MOD
        E = (E * invm) % MOD
        if E < 0:
            E = (MOD + E) % MOD
        with open("alOUT.txt", "w") as fout:
            fout.write(str(E))
    except Exception as e:
        with open("alOUT.txt", "w") as fout:
            fout.write(str(e))
if __name__ == "__main__":
    main()
</syntaxhighlight>

Latest revision as of 17:02, 18 May 2024

Al Bundy a plecat la serviciu, lăsându-i soţiei lui, Peg, cardul de cumpărături. PIN-ul este valoarea expresiei E(n)=∑nk=1(2⋅(a2+b2)k2⋅cos(k⋅α)), unde α=arctg(ab) , iar n, a, b sunt numere naturale nenule.

Cerința[edit | edit source]

Să se afle valoarea expresiei , modulo 1.000.000.007.

Date de intrare[edit | edit source]

Fișierul de intrare alIN.txt conține pe prima linie numerele n, a, b, separate prin spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire alOUT.txt va conține pe prima linie valoarea expresiei , modulo 1.000.000.007. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • 1 ≤ n ≤ 1012
  • 1 ≤ a , b ≤ 20

Exemplul 1:[edit | edit source]

alIN.txt

3 5 12

alOUT.txt

1918

Explicatie[edit | edit source]

Dacă α=arctg(5/12), atunci sin(α)=5/13 şi cos(α)=12/13. Avem E(3)=2⋅13⋅cos(α)+2⋅13*2⋅cos(2α)+2⋅13*3⋅cos(3α)=2⋅13⋅12/13+2⋅13*2⋅(2⋅cos2(α)−1)+2⋅13*3⋅(4⋅cos*3(α)−3⋅cos(α))=24+238+1656=1918.

Exemplul 2:[edit | edit source]

alIN.txt

3 21 12

alOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> MOD = 1000000007

def gcd(a, b):

   if b == 0:
       return (1, 0)
   else:
       x, y = gcd(b, a % b)
       return (y, x - y * (a // b))

def prod(x, y):

   ret = [[0, 0], [0, 0]]
   ret[0][0] = (x[0][0] * y[0][0] + x[0][1] * y[1][0]) % MOD
   ret[0][1] = (x[0][0] * y[0][1] + x[0][1] * y[1][1]) % MOD
   ret[1][0] = (x[1][0] * y[0][0] + x[1][1] * y[1][0]) % MOD
   ret[1][1] = (x[1][0] * y[0][1] + x[1][1] * y[1][1]) % MOD
   return ret

def pwr(mat, n):

   nullMat = [[1, 0], [0, 1]]
   if n == 0:
       return nullMat
   if n % 2:
       return prod(mat, pwr(prod(mat, mat), n // 2))
   return pwr(prod(mat, mat), n // 2)

def verify_restrictions(n, a, b):

   if 1 <= n <= 1012 and 1 <= a <= 20 and 1 <= b <= 20:
       return True
   return False

def main():

   try:
       with open("alIN.txt", "r") as fin:
           line = fin.readline().strip()
           if not line:
               raise ValueError("File is empty or invalid format.")
           n, a, b = map(int, line.split())
       if not verify_restrictions(n, a, b):
           with open("alOUT.txt", "w") as fout:
               fout.write("Datele nu corespund restrictiilor impuse")
           return
       if n == 1:
           E = ((a * a + b * b) * (2 * b - 2) - 2 * (b * b - a * a) + 2 * b) // (a * a + b * b - 2 * b + 1)
           with open("alOUT.txt", "w") as fout:
               fout.write(str(E))
           return
       numi = (b - 1) ** 2 + a * a
       pat = a * a + b * b
       invm, ins = gcd(numi, MOD)
       initMat = [[2 * b, -pat], [1, 0]]
       Alt = [[2 * (b * b - a * a), 0], [2 * b, 0]]
       C = pwr(initMat, n - 1)
       sol = prod(C, Alt)
       En = -2 * pat + 2 * b
       E = (pat * sol[1][0] - sol[0][0] + En) % MOD
       E = (E * invm) % MOD
       if E < 0:
           E = (MOD + E) % MOD
       with open("alOUT.txt", "w") as fout:
           fout.write(str(E))
   except Exception as e:
       with open("alOUT.txt", "w") as fout:
           fout.write(str(e))

if __name__ == "__main__":

   main()

</syntaxhighlight>