DefiniamoF (N) il numero di coppie di numeri interi positivi distinti (A, B) tale che A + B ≤n e A < B.Dato un numero N quante coppie di numeri hanno una somma quadrata inferiore o uguale a N?
Se N = 5 l'unico tale coppia è possibile (1,2) per N = 10 le coppie sono due: (1,2) e(1,3).
Inoltre abbiamo F (13) = 3, F (17) = 4, F (17) = 4, F (20) = 5, F (20) = 5, F (25) = 6, F (100) = 31 e così via per ogni numero che è la somma di due quadrati diversi da zero.
Finora ho la seguente soluzione:
long long SOLVE(lld n)
{
long long x=sqrt(n),up=0;
long long a=x,b=1;
while(abs(a-(b-1))!=1)
{
while(sqr(a)+sqr(b)<=n)
{
b++;
}
up+=(b-1);
a--;
}
b--;
up+=(b*(b+1))/2;
return up;
}
int main()
{
cout<<number(100);
return 0;
}
numeri stessi non sono numerabili, quindi (1,1) e(2,2) sono tuple non validi. La stessa combinazione ma conteggio di ordini diversi una sola volta. Pertanto, (1,2) e (2,1) contano solo come una volta.
Tuttavia, poiché l'intervallo di N è 1, ho bisogno di un algoritmo o di una formula più efficienti per calcolarlo. C'è qualche trucco per rendere il mio codice più efficiente?
* A * deve essere inferiore a * B *? Altrimenti potrebbero essere contate anche le tuple * (2,1) * e * (3,1) *. –
No (1,2) e (2,1) entrambi vengono conteggiati una sola volta. –
Inoltre cos'è 'lld'? Sono un po 'familiare con C++, ma non so di che tipo si tratta. –