Salve stavo provando a risolvere Shiftmul e penso di essere a buon punto della soluzione ma non riesco a capire come ottenere l’ultima parte delle moltiplicazioni:
#include <bits/stdc++.h>
using namespace std;
int N, K, D;
const int MOD = 1e9 + 7;
int power(long long x, unsigned int y, int p)
{
int res = 1;
x = x % p;
if (x == 0) return 0;
while (y > 0)
{
if (y & 1)
res = (res*x) % p;
y = y >> 1;
x = (x*x) % p;
}
return res;
}
int prev(int ind) { return (ind + N - D) % N; }
int next(int ind) { return (ind + D) % N; }
vector<int> execute(int n, int k, int d, vector<int> A)
{
N = n, K = k, D = d;
vector<int> prefProd(N, 1);
int ind = 0;
for (int i = 0; i <= N; ind = prev(ind), i++)
{
prefProd[prev(ind)] = (1LL * prefProd[ind] * A[ind]) % MOD;
// cout << ind << " " << nxtProd[ind] << " " << prefProd[ind] << endl;
}
vector<int> B(N);
for (int i = 0; i < N; i++)
{
int laps = K / N;
int rem = K % N;
if (D == 0) {B[i] = power(A[i], K, MOD); continue;}
B[i] = power(prefProd[0], laps, MOD);
// Qui pensavo di sfruttare il vettore di prodotti prefissi
// calcolando solo i prodotti nell'intervallo che mi interessa
int end = (i + rem * D) % N;
if (prefProd[end] > prefProd[prev(i)])
B[i] = (1LL * B[i] * prefProd[end] / prefProd[prev(i)]) % MOD;
else
B[i] = (1LL * B[i] * prefProd[i] / prefProd[prev(end)]) % MOD;
}
return B;
}
Qualche hint?