A to B

You are given an array A initially comprising of N non-negative integers A[1], A[2], A[3]..... A[N]. An array B can be generated from array A in the following manner :

for(i=1;i<=N;i++)
{
    B[i]=1;
    for(j=1;j<=N;j++)
    {
        if(i!=j)
        {
            B[i]=B[i]*A[j];
        }
    }
}

You will now be given Q queries, each query being either of the two types :

Type 1 : 0 ID V : Set A[ID] = V

Type 2: 1 ID: Generate the array B from the current array A and print the value of B[ID] modulo 10^9 + 7.

You must do as directed in each query.

NOTE: Both array A and array B are 1-indexed.

Example:

Input:  n = 5, a = {1, 2, 3, 4, 5}, q = 3, queries = {{1, 3}, {0, 2, 4}, {1, 4}}

Output:

40 60

Approach:

C++

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007

long long mpow(long long along long b)
{
    if (b == 0)
        return 1;
    if (b == 1)
        return a % mod;
    long long x = mpow(ab / 2) % mod;
    long long y = (x * x) % mod;
    if (b % 2 == 1)
    {
        long long res = (a % mod * y) % mod;
        return res;
    }
    return y;
}

void atoB(long long nvector<long longalong long q,
          vector<vector<long long>> queries)
{

    long long p = 1zc = 0;
    for (int i = 0i < ni++)
    {
        if (a[i] != 0)
            p = (p * a[i]) % mod;
        else
            zc++;
    }
    for (int i = 0i < qi++)
    {
        long long type = queries[i][0];
        if (type == 1)
        {
            long long id = queries[i][1];

            id--;
            if (a[id] == 0 and zc == 1)
                cout << p << "\n";
            if (a[id] == 0 and zc > 1)
                cout << 0 << "\n";
            if (a[id] != 0 and zc > 0)
                cout << 0 << "\n";
            if (a[id] != 0 and zc == 0)
            {
                long long res = (p * mpow(a[id]mod - 2)) % mod;
                cout << res << "\n";
            }
        }
        else
        {
            long long id = queries[i][1];
            long long x = queries[i][2];

            id--;
            if (a[id] == 0 and x != 0)
            {
                a[id] = x;
                p = (p * x) % mod;
                zc--;
            }
            if (a[id] != 0 and x == 0)
            {
                p = (p * mpow(a[id]mod - 2)) % mod;
                zc++;
                a[id] = 0;
            }
            if (a[id] != 0 and x != 0)
            {
                p = (p * x) % mod;
                p = (p * mpow(a[id]mod - 2)) % mod;
                a[id] = x;
            }
        }
    }
}

int main()
{

    long long n = 5;
    vector<long longa = {12345};

    long long q = 3;

    vector<vector<long long>> queries = {{13},
                                         {024},
                                         {14}};

    atoB(naqqueries);
    return 0;
}


No comments:

Post a Comment