Mal F (N) als die Anzahl von Paaren von verschiedenen positiven ganzen Zahlen (A, B), so dassA 2 + B 2 ≤ N und A < B definieren.Gegeben eine Zahl N, wie viele Zahlenpaare eine Quadratsumme kleiner oder gleich N haben?
Wenn N = 5 das einzig mögliche solches Paar ist (1,2)für N = 10 die Paare sind zwei: (1,2) und(1,3).
Außerdem haben wir F (13) = 3, F (17) = 4, F (17) = 4, F (20) = 5, F (20) = 5, F (25) = 6, F (100) = 31 usw. für jede Zahl, die die Summe zweier unterschiedlicher Quadrate ungleich Null ist.
Bisher habe ich die folgende Lösung:
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;
}
Gleiche Zahlen sind nicht zählbar, so (1,1) und (2,2) ungültig Tupel sind. Gleiche Kombination aber unterschiedliche Reihenfolge zählt nur einmal. Also (1,2) und (2,1) zählen nur als einmal.
Aber wie der Bereich von N 1 ist, brauche ich einen effizienteren Algorithmus oder eine Formel, um dies zu berechnen. Gibt es einen Trick, um meinen Code effizienter zu machen?
Muss * A * kleiner als * B * sein? Ansonsten könnten die Tupel * (2,1) * und * (3,1) * ebenfalls zählen. –
Nein (1,2) und (2,1) beide zählen nur einmal. –
Außerdem, was ist 'lld'? Ich bin ein bisschen vertraut mit C++, weiß aber nicht, um welchen Typ es sich handelt. –